Seite 1 von 1

SQL-Nachhilfe

Verfasst: 29.08.2005 15:09
von thowa
Moin,

da es anscheinend keinen Mod gibt, der eine Erinnerungsmail an alle Leute schickt, die sich an einer Abstimmung noch nicht beteiligt haben, will ich das jetzt selbst machen.

Ich kenne mich mit SQL nicht besonders gut aus. Einfache queries bekomme ich hin, aber mit komplexen Abfragen hatte ich noch keinen Kontakt.

Ich suche eine Liste der Leute, die zu einem bestimmten Poll noch nicht abgestimmt haben.
Es gibt da die php_users tabelle. Klar, die enthält die user.
Dann gibt es noch die php_vote_voters. Die enthält die Leute die schon abgestimmt haben.

Kann man daraus eine einzige SQL Query erstellen?

Wenn ich mich nicht ganz irre, listed die folgende query alle user, die zum Poll "4" abgestimmt haben. Oder ???

Code: Alles auswählen

		SELECT DISTINCT u.user_id, u.username FROM stb_phpbb_users AS u , stb_phpbb_vote_voters  AS vv WHERE u.user_id = vv.vote_user_id and vv.vote_id = '4'
Wie kann ich das umkehren, ich will ja schließlich die leute herausfinden, die noch nicht abgestimmt haben.


Kennt jemand eine gute MySQL Seite? dev.mysql.com ist für einen Anfägner schon harter tobak
:lol:


Danke, Thorsten

Re: SQL-Nachhilfe

Verfasst: 29.08.2005 15:43
von thowa
thowa hat geschrieben: Einfacher als ich gedacht habe

Code: Alles auswählen

		SELECT DISTINCT u.user_id, u.username FROM stb_phpbb_users AS u , stb_phpbb_vote_voters  AS vv WHERE u.user_id <> vv.vote_user_id and vv.vote_id = '4'
Das hatte ich zwar schon ausprobiert, aber anscheinend eine Tippfehler gemacht. :oops:

Thorsten

Verfasst: 29.08.2005 22:45
von PhilippK
Du wirst bei älteren MySQL-Versionen Probleme bekommen, das mit einer Abfrage zu lösen: du könntest beide Tabellen zwar mit einem JOIN in Verbindung bringen (ähnlich dem, was du versuchst) und dir alle User und ggf. die zugeordneten Abstimmungen ausgeben lassen.

Code: Alles auswählen

SELECT u.user_id, u.username
FROM stb_phpbb_users u
  LEFT JOIN stb_phpbb_vote_voters vv
...
Allerdings werden dort User mehrfach ausgegeben, die an mehreren Abstimmungen teilgenommen haben. Filterst du jetzt die aus, die schon mal abgestimmt haben, so fliegen alle raus, die schon an irgendeiner Abstimmung teilgenommen haben. Filterst du nur die raus, die an der bestimmten Abstimmung teilgenommen haben, so bleiben dir die erhalten, die an einer anderen Abstimmung teilgenommen haben. Derzeit führt der Weg da nur über etwas komplexere PHP-Krücken, die entsprechend die Datensätze einzeln prüfen.

In neueren Versionen von MySQL (ab 4.1) gibt es jedoch einen anderen Weg: die Subquerys. Da verbindest du zwei Abfragen:

Code: Alles auswählen

SELECT user_id, username
FROM stb_phpbb_users
WHERE user_id NOT IN (SELECT vote_user_id FROM stb_phpbb_vote_voters WHERE vote_id = 4)
Gruß, Philipp

Verfasst: 30.08.2005 09:10
von thowa
Danke für den Hinweis.

Mein Hoster hat 4.0.25 installiert. (zumindest ist das die Client API version , die phpinfo ausspuckt...)
Wieso klappt meine Query trotzdem?

Verfasst: 30.08.2005 10:20
von PhilippK
Welche deiner Querys klappt - und bringt sie auch das richtige Ergebnis?

Gruß, Philipp

Verfasst: 30.08.2005 10:27
von thowa
Die Letztere, Korrigierte. Also die hier:

Code: Alles auswählen

SELECT DISTINCT u.user_id, u.username FROM stb_phpbb_users AS u , stb_phpbb_vote_voters  AS vv WHERE u.user_id <> vv.vote_user_id and vv.vote_id = '4'
Der Unterschied ist nur u.user_id <> vv.vote_user_id.

Ich meine, die liefert ein korrektes Ergebnis.

Tschööö Thorsten

Verfasst: 01.09.2005 15:21
von thowa
Sorry. Ich muß mich nochmals korrogieren.

Die letzte query mit <> liefert nicht die user, die noch nicht gevotet haben, sonder ALLE.

Dann bleibt mir wohl nur die Möglichkeit das mit zwei getrennten SQL Abfragen zu erledigen und in PHP herauszufiltern, wer schon abgestimmt hat???

Danke, Thorsten

Verfasst: 01.09.2005 22:49
von PhilippK
Jepp - genau so ist es :-(

Gruß, Philipp

Verfasst: 02.09.2005 14:38
von thowa
Also ich erstelle jetzt zuerst ein Array ALLER user.

Anschließend lasse ich die Abfrage nach den Usern laufen, die gevotet haben.
Für die gefundenen User lösche ich die Elemente im Array (unset).

Kennt jemand einen besseren Weg?

Danke, Thorsten

Verfasst: 02.09.2005 17:57
von PhilippK
Schreibe alle User in ein Array, die schon abgestimmt haben.
Verbinde dann das Array mit implode() zu einer kommagetrennten Liste
Frage dann alle User ab, wobei du die User mit

Code: Alles auswählen

user_id NOT IN (...)
rausfilterst. (... durch die Liste ersetzen)

Gruß, Philipp