Ecco un modo tipico per eseguire questa query senza utilizzare il metodo di sottoquery mostrato. Questo potrebbe soddisfare la richiesta di @Godeke di vedere una soluzione basata su join.
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;
Tuttavia, nella maggior parte delle marche di database questa soluzione può avere prestazioni peggiori rispetto alla soluzione di subquery. È meglio utilizzare EXPLAIN per analizzare entrambe le query, per vedere quale funzionerà meglio in base allo schema e ai dati.
Ecco un'altra variazione sulla soluzione subquery:
SELECT *
FROM movies m
WHERE NOT EXISTS (SELECT * FROM seen s
WHERE s.movie_id = m.id
AND s.user_id=123);
Questa è una sottoquery correlata, che deve essere valutata per ogni riga della query esterna. Di solito questo è costoso e la tua query di esempio originale è migliore. D'altra parte, in MySQL "NOT EXISTS
" è spesso migliore di "column NOT IN (...)
"
Ancora una volta, devi testare ogni soluzione e confrontare i risultati per essere sicuro. È una perdita di tempo scegliere una soluzione senza misurare le prestazioni.