Oto typowy sposób wykonania tego zapytania bez użycia pokazanej metody podzapytania. Może to spełnić prośbę @Godeke, aby zobaczyć rozwiązanie oparte na dołączaniu.
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;
Jednak w większości marek baz danych to rozwiązanie może działać gorzej niż rozwiązanie podzapytania. Najlepiej użyć EXPLAIN do analizy obu zapytań, aby zobaczyć, które z nich będzie lepiej działać, biorąc pod uwagę Twój schemat i dane.
Oto kolejna odmiana rozwiązania podzapytania:
SELECT *
FROM movies m
WHERE NOT EXISTS (SELECT * FROM seen s
WHERE s.movie_id = m.id
AND s.user_id=123);
Jest to skorelowane podzapytanie, które musi zostać ocenione dla każdego wiersza zapytania zewnętrznego. Zwykle jest to kosztowne, a Twoje oryginalne przykładowe zapytanie jest lepsze. Z drugiej strony w MySQL „NOT EXISTS
" jest często lepsze niż "column NOT IN (...)
Ponownie musisz przetestować każde rozwiązanie i porównać wyniki, aby mieć pewność. Wybieranie dowolnego rozwiązania bez mierzenia wydajności to strata czasu.