SQL-Nachhilfe

In diesem Forum können Mod-Autoren ihre Mods vorstellen, die sich noch im Entwicklungsstatus befinden. Der Einbau in Foren im produktiven Betrieb wird nicht empfohlen.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.0, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
thowa
Mitglied
Beiträge: 55
Registriert: 19.07.2005 15:11

SQL-Nachhilfe

Beitrag 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
thowa
Mitglied
Beiträge: 55
Registriert: 19.07.2005 15:11

Re: SQL-Nachhilfe

Beitrag 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
PhilippK
Vorstand
Vorstand
Beiträge: 14662
Registriert: 13.08.2002 14:10
Wohnort: Stuttgart
Kontaktdaten:

Beitrag 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
Kein Support per PN!
Der Sozialstaat ist [...] eine zivilisatorische Errungenschaft, auf die wir stolz sein können. Aber der Sozialstaat heutiger Prägung hat sich übernommen. Das ist bitter, aber wahr. (Horst Köhler)
Meine Mods
thowa
Mitglied
Beiträge: 55
Registriert: 19.07.2005 15:11

Beitrag 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?
PhilippK
Vorstand
Vorstand
Beiträge: 14662
Registriert: 13.08.2002 14:10
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von PhilippK »

Welche deiner Querys klappt - und bringt sie auch das richtige Ergebnis?

Gruß, Philipp
Kein Support per PN!
Der Sozialstaat ist [...] eine zivilisatorische Errungenschaft, auf die wir stolz sein können. Aber der Sozialstaat heutiger Prägung hat sich übernommen. Das ist bitter, aber wahr. (Horst Köhler)
Meine Mods
thowa
Mitglied
Beiträge: 55
Registriert: 19.07.2005 15:11

Beitrag 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
thowa
Mitglied
Beiträge: 55
Registriert: 19.07.2005 15:11

Beitrag 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
PhilippK
Vorstand
Vorstand
Beiträge: 14662
Registriert: 13.08.2002 14:10
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von PhilippK »

Jepp - genau so ist es :-(

Gruß, Philipp
Kein Support per PN!
Der Sozialstaat ist [...] eine zivilisatorische Errungenschaft, auf die wir stolz sein können. Aber der Sozialstaat heutiger Prägung hat sich übernommen. Das ist bitter, aber wahr. (Horst Köhler)
Meine Mods
thowa
Mitglied
Beiträge: 55
Registriert: 19.07.2005 15:11

Beitrag 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
Zuletzt geändert von thowa am 03.09.2005 14:04, insgesamt 1-mal geändert.
PhilippK
Vorstand
Vorstand
Beiträge: 14662
Registriert: 13.08.2002 14:10
Wohnort: Stuttgart
Kontaktdaten:

Beitrag 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
Kein Support per PN!
Der Sozialstaat ist [...] eine zivilisatorische Errungenschaft, auf die wir stolz sein können. Aber der Sozialstaat heutiger Prägung hat sich übernommen. Das ist bitter, aber wahr. (Horst Köhler)
Meine Mods
Antworten

Zurück zu „phpBB 2.0: Mods in Entwicklung“