Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Zeile nur zurückgeben, wenn Wert nicht vorhanden ist

SELECT *
FROM reservation
WHERE id NOT IN (select reservation_id
                 FROM reservation_log
                 WHERE change_type = 'cancel')

ODER:

SELECT r.*
FROM reservation r
LEFT JOIN reservation_log l ON r.id = l.reservation_id AND l.change_type = 'cancel'
WHERE l.id IS NULL

Die erste Version ist intuitiver, aber ich denke, dass die zweite Version normalerweise eine bessere Leistung erzielt (vorausgesetzt, Sie haben Indizes für die im Join verwendeten Spalten).

Die zweite Version funktioniert, weil LEFT JOIN gibt eine Zeile für alle Zeilen in der ersten Tabelle zurück. Wenn ON Bedingung erfolgreich ist, enthalten diese Zeilen die Spalten aus der zweiten Tabelle, genau wie INNER JOIN . Wenn die Bedingung fehlschlägt, enthält die zurückgegebene Zeile NULL für alle Spalten in der zweiten Tabelle. Der WHERE l.id IS NULL test gleicht dann diese Zeilen ab, also findet es alle Zeilen, die keine Übereinstimmung zwischen den Tabellen haben.