MySQL SELECT mit JOIN per oder verbinden
Hallo,
ich habe folgenden SQL Befehl:
Mein Problem ist das in der WHERE klausel das "AND". Der müsste sich aber nur auf den reinen SELECT beziehen. Nicht aber auf den JOIN.
Es muss doch möglich sein eine Art "oder" Verbindung zwischen den SELCT und dem JOIN herzustellen.
Das entweder was in der "queuelist " gefunden wird wo die ID übereinstimmt oder halt aus der "songlist" wo die WHERE zutreffen muss.
ich habe folgenden SQL Befehl:
SELECT songlist.artist, songlist.title, songlist.album, songlist.ID, songlist.date_played, songlist.date_artist_played, songlist.date_album_played FROM songlist
LEFT JOIN queuelist ON songlist.ID=queuelist.songID
WHERE songlist.ID='xxxx'
AND (
songlist.date_played > NOW()- INTERVAL 120 MINUTE OR
songlist.date_artist_played > NOW()- INTERVAL 60 MINUTE OR
songlist.date_album_played > NOW()- INTERVAL 30 MINUTE
) LIMIT 1
Es muss doch möglich sein eine Art "oder" Verbindung zwischen den SELCT und dem JOIN herzustellen.
Das entweder was in der "queuelist " gefunden wird wo die ID übereinstimmt oder halt aus der "songlist" wo die WHERE zutreffen muss.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 157079
Url: https://administrator.de/forum/mysql-select-mit-join-per-oder-verbinden-157079.html
Ausgedruckt am: 02.04.2025 um 09:04 Uhr
9 Kommentare
Neuester Kommentar
Hallöchen wieder,
und dann geht das auch nicht? Du hast das Ganze mit Limit 1 gemacht, also bekommst Du auch aus dem Stapel völlig willkürlich einen Satz zurück?
Zeig doch nochmal dein richtiges SQL, das Beispiel oben kann es nicht gewesen sein. Da hätte er Dich nach der Tabelle queuelist fragen müssen. Bei Deinem Beispiel frage ich mich nämlich, wozu Du queuelist überhaupt brauchst.
Gruß Sam
und dann geht das auch nicht? Du hast das Ganze mit Limit 1 gemacht, also bekommst Du auch aus dem Stapel völlig willkürlich einen Satz zurück?
Zeig doch nochmal dein richtiges SQL, das Beispiel oben kann es nicht gewesen sein. Da hätte er Dich nach der Tabelle queuelist fragen müssen. Bei Deinem Beispiel frage ich mich nämlich, wozu Du queuelist überhaupt brauchst.
Gruß Sam
Hallo,
Quick und dirty aus der Hüfte, wenn Dich nur die Anzahl der gespielten Songs interessiert. Das Problem ist, dass normalerweise eine der beiden IDs NULL ist (entweder schon gehört oder noch nicht gehört). Wenn man denselben Titel nicht dauernd hört, bzw hört UND in der Playlist hat
Das geht schöner, sollte aber so vom Ansatz klar sein.
Gruß Sam
SELECT count (* ) from songlist, queuelist
WHERE ( songlist.ID='xxxx' and
songlist.date_played > NOW()- INTERVAL 120 MINUTE OR
songlist.date_artist_played > NOW()- INTERVAL 60 MINUTE OR
songlist.date_album_played > NOW()- INTERVAL 30 MINUTE )
or quelist.Id ='xxxx'
Quick und dirty aus der Hüfte, wenn Dich nur die Anzahl der gespielten Songs interessiert. Das Problem ist, dass normalerweise eine der beiden IDs NULL ist (entweder schon gehört oder noch nicht gehört). Wenn man denselben Titel nicht dauernd hört, bzw hört UND in der Playlist hat
Das geht schöner, sollte aber so vom Ansatz klar sein.
Gruß Sam
Hallo,
Gruß Sam
Leider nicht, dort fehlt auch die Verbindung von songlist.ID und queuelist.songID.
OK. Der Song muss in der Songliste stehen. Dann zurück auf AnfangSELECT felder FROM songlist, queuelist
LEFT JOIN queuelist ON songlist.ID=queuelist.songID
WHERE songlist.ID='xxxx'
AND ((songlist.date_played > NOW()- INTERVAL 120 MINUTE OR
songlist.date_artist_played > NOW()- INTERVAL 60 MINUTE OR
songlist.date_album_played > NOW()- INTERVAL 30 MINUTE)
or (queuelist.id not NULL))
LIMIT 1
Gruß Sam
Hallo,
ich glaube, dein Ansatz ist etwas von hinten in die Brust, ein UNION könnte besser geeignet sein als ein JOIN.
Grob:
Also einfach die zutreffenden Zeile(n) aus queuelist selektieren (bzw nur ein Feld), dann die aus songlist, beide aneinanderhängen, und gucken, ob es wenigstens eine war.
Wenn ich das richtig in Erinnerung habe gibt es auch eine EXISTS-Abfrage, damit wäre das dann noch eleganter.
Gruß
Filipp
ich glaube, dein Ansatz ist etwas von hinten in die Brust, ein UNION könnte besser geeignet sein als ein JOIN.
Grob:
SELECT COUNT(*) FROM (
SELECT id FROM queuelist WHERE queuelist.id = xxx
UNION
SELECT id FROM songlist WHERE (ID = xxx AND date_played >.... AND ....)
)
Also einfach die zutreffenden Zeile(n) aus queuelist selektieren (bzw nur ein Feld), dann die aus songlist, beide aneinanderhängen, und gucken, ob es wenigstens eine war.
Wenn ich das richtig in Erinnerung habe gibt es auch eine EXISTS-Abfrage, damit wäre das dann noch eleganter.
Gruß
Filipp