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.