dedlfix: Hilfe bei Select über 2 Tabellen

Beitrag lesen

Hi!

Und zwar sollen bei dieser Abfrage nur Einträge aus 'ticket' gezeigt werden, die keinen verknüpften Eintrag in 'antwort' haben.

Dann mach das doch auch so, wie du es sagst: SELECT * FROM ticket WHERE id NOT IN(SELECT ticket FROM antwort)

Hier meine Query:
select A.* from ticket A JOIN antwort B ON B.ticket != A.id WHERE A.status = 'open' order by A.timestamp asc
Leider erhalte ich die Einträge sogar doppelt, da es noch einen Eintrag in 'ticket' gibt (welcher nicht angezeigt wird) und 2 Einträge in der Tabelle 'antwort' hat.

Du erzeugst einen Inner Join. Die Bedingung B.ticket != A.id passt auf alle anderen Datensätze, nur nicht auf die korrespondierenden. Soweit so richtig. Der Inner Join jedoch bewirkt, dass vom Rest ein kartesisches Produkt angefertigt wird. Das heißt, alle übrig gebliebenen B-Datensätze werden mit den übrig gebliebenen A-Datensätzen multipliziert. Wenn A1 mit B1 verknüpft ist, so landet der Datensatz nicht im Ergebnis. Allerdings landet A1 trotzdem in der Ergebnismenge, wenn er nicht mit B2 verknüpft ist, denn dann erfüllt sich die Join-Bedingung. Wenn A2 weder mit B1 noch mit B2 verknüpft ist, erfüllt sich die Bedingung gleich zweimal. Und so weiter.

Mit einem Join müsstest du einen Left Join nehmen, der auf Gleichheit prüft:

a LEFT JOIN b ON a.id = b.ticket

Damit bekommst du alle A mit ihrem zugehörigen B und - dank des Left Joins - auch alle A zu denen kein B existiert. Da du nur letztere haben möchtest, musst du nun nur die Einträge der JOIN-Zwischenergebnismenge wählen, die keine B-Daten haben.

WHERE b.irgendeinfeld IS NULL

Das nur zur Erklärung. Du solltest lieber die obige Subquery-Lösung nehmen, denn die dürfte einfacher verständlich als die Join-Lösung sein.

Lo!