Ето един типичен начин да направите тази заявка, без да използвате метода на подзаявката, който показахте. Това може да удовлетвори искането на @Godeke да види решение, базирано на присъединяване.
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;
Въпреки това, в повечето марки бази данни това решение може да работи по-лошо от решението за подзаявка. Най-добре е да използвате EXPLAIN, за да анализирате и двете заявки, за да видите коя от тях ще се справи по-добре предвид вашата схема и данни.
Ето още един вариант на решението на подзаявката:
SELECT *
FROM movies m
WHERE NOT EXISTS (SELECT * FROM seen s
WHERE s.movie_id = m.id
AND s.user_id=123);
Това е корелирана подзаявка, която трябва да бъде оценена за всеки ред от външната заявка. Обикновено това е скъпо, а оригиналната ви примерна заявка е по-добра. От друга страна, в MySQL „NOT EXISTS
" често е по-добро от "column NOT IN (...)
"
Отново трябва да тествате всяко решение и да сравните резултатите, за да сте сигурни. Загуба на време е да избирате каквото и да е решение, без да измервате ефективността.