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

MySQL:Finden von Zeilen, die nicht an einer Beziehung teilnehmen

Hier ist eine typische Möglichkeit, diese Abfrage durchzuführen, ohne die von Ihnen gezeigte Unterabfragemethode zu verwenden. Dies könnte @Godekes Wunsch erfüllen, eine Join-basierte Lösung zu sehen.

SELECT * 
FROM movies m
 LEFT OUTER JOIN seen s
 ON (m.id = s.movie_id AND s.user_id = 123)
WHERE s.movie_id IS NULL;

Bei den meisten Datenbankmarken kann diese Lösung jedoch schlechter abschneiden als die Unterabfragelösung. Verwenden Sie am besten EXPLAIN, um beide Abfragen zu analysieren, um zu sehen, welche angesichts Ihres Schemas und Ihrer Daten besser abschneidet.

Hier ist eine weitere Variante der Unterabfragelösung:

SELECT * 
FROM movies m
WHERE NOT EXISTS (SELECT * FROM seen s 
                  WHERE s.movie_id = m.id 
                    AND s.user_id=123);

Dies ist eine korrelierte Unterabfrage, die für jede Zeile der äußeren Abfrage ausgewertet werden muss. Normalerweise ist dies teuer und Ihre ursprüngliche Beispielabfrage ist besser. Andererseits ist in MySQL „NOT EXISTS " ist oft besser als "column NOT IN (...) "

Auch hier müssen Sie jede Lösung testen und die Ergebnisse vergleichen, um sicherzugehen. Es ist Zeitverschwendung, eine Lösung auszuwählen, ohne die Leistung zu messen.