sql >> Database >  >> RDS >> Mysql

MySQL:rijen vinden die niet deelnemen aan een relatie

Hier is een typische manier om deze query uit te voeren zonder de subquerymethode te gebruiken die u heeft laten zien. Dit kan voldoen aan het verzoek van @Godeke om een ​​op joins gebaseerde oplossing te zien.

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;

In de meeste databasemerken kan deze oplossing echter slechter presteren dan de subquery-oplossing. Het is het beste om EXPLAIN te gebruiken om beide zoekopdrachten te analyseren, om te zien welke het beter doet gezien uw schema en gegevens.

Hier is nog een variatie op de subquery-oplossing:

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

Dit is een gecorreleerde subquery, die moet worden geëvalueerd voor elke rij van de buitenste query. Meestal is dit duur, en uw oorspronkelijke voorbeeldquery is beter. Aan de andere kant, in MySQL "NOT EXISTS " is vaak beter dan "column NOT IN (...) "

Nogmaals, u moet elke oplossing testen en de resultaten vergelijken om zeker te zijn. Het is tijdverspilling om een ​​oplossing te kiezen zonder de prestaties te meten.



  1. 2 tabellen samenvoegen voor een SELECT-query?

  2. MySQL:geef de primaire sleutel een naam in de CREATE TABLE-instructie

  3. Tijdsverschil tussen 2 datums in minuten berekenen

  4. Poging om voorbij het einde van de streamfout te lezen in MySQL