Zde je typický způsob, jak provést tento dotaz bez použití metody poddotazu, kterou jste ukázali. To může uspokojit požadavek @Godeke na zobrazení řešení založeného na spojení.
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;
U většiny značek databází však toto řešení může fungovat hůře než řešení poddotazů. K analýze obou dotazů je nejlepší použít EXPLAIN, abyste viděli, který bude fungovat lépe vzhledem k vašemu schématu a datům.
Zde je další varianta řešení poddotazu:
SELECT *
FROM movies m
WHERE NOT EXISTS (SELECT * FROM seen s
WHERE s.movie_id = m.id
AND s.user_id=123);
Toto je korelovaný poddotaz, který musí být vyhodnocen pro každý řádek vnějšího dotazu. Obvykle je to drahé a váš původní příklad dotazu je lepší. Na druhou stranu v MySQL "NOT EXISTS
" je často lepší než "column NOT IN (...)
"
Opět musíte vyzkoušet každé řešení a porovnat výsledky, abyste si byli jisti. Výběr jakéhokoli řešení bez měření výkonu je ztráta času.