Вот типичный способ выполнить этот запрос без использования показанного вами метода подзапроса. Это может удовлетворить запрос @ 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 (...)
»
Опять же, вы должны проверить каждое решение и сравнить результаты, чтобы убедиться. Выбор любого решения без измерения производительности - пустая трата времени.