Чтобы уточнить. Важно знать, что:
. Вот рабочий фрагмент кода, где мы немного манипулируем датами для обеспечения Mongo (здесь я использую mongoose и хотите, чтобы результаты для строк, атрибут даты которых меньше (до) даты, заданной как параметр myDate), могут корректно обрабатывать:
var inputDate = new Date(myDate.toISOString());
MyModel.find({
'date': { $lte: inputDate }
})
Вот типичный способ сделать этот запрос, не используя подметод запроса, который Вы показали. Это может удовлетворить запрос @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;
Однако в большинстве брендов базы данных это решение может работать хуже, чем решение для подзапроса. Лучше использовать, ОБЪЯСНЯЮТ, чтобы проанализировать оба запроса, видеть, какой добьется большего успеха, учитывая Вашу схему и данные.
Вот другая вариация на решение для подзапроса:
SELECT *
FROM movies m
WHERE NOT EXISTS (SELECT * FROM seen s
WHERE s.movie_id = m.id
AND s.user_id=123);
Это - связанный подзапрос, который должен быть оценен для каждой строки внешнего запроса. Обычно это дорого, и Ваш исходный запрос в качестве примера лучше. С другой стороны, в MySQL "112" часто лучше, чем" column NOT IN (...)
"
Снова, необходимо протестировать каждое решение и сравнить результаты, чтобы быть уверенными. Это - пустая трата времени для выбора любого решения, не измеряя уровень.
Мало того, что Ваш запрос работает, это - правильный подход к проблеме, как указано. Возможно, можно ли найти другой способ приблизиться к проблеме? Простой ПРЕДЕЛ на Ваш внешний выбор должен быть очень быстрым даже для больших таблиц, например.
Замеченный Ваша объединяющая таблица, таким образом, да, это похоже на правильное решение. Вы эффективно "вычитаете" набор идентификаторов фильма в ЗАМЕЧЕННОМ (для пользователя) от всего количества в ФИЛЬМАХ, приводя к невидимым фильмам для того пользователя.
Это называют "отрицательным соединением", и печально НЕ В или НЕ СУЩЕСТВУЕТ, наилучшие варианты. (Я хотел бы видеть отрицательный синтаксис соединения, который был подобен ВНУТРЕННИМ/ВНЕШНИМ/ЛЕВЫМ/ПРАВИЛЬНЫМ соединениям, но где НА пункте мог быть оператор вычитания).
решение @Bill без подзапроса должно работать, хотя, поскольку он отметил, что это - хорошая идея протестировать Ваше решение на производительность оба пути. Я подозреваю, что подзапрос или нет, весь индекс SEEN.ID (и конечно весь индекс MOVIE.ID) будет оцененным оба пути: это будет зависеть от того, как оптимизатор обрабатывает его оттуда.
Если Ваш DBMS поддерживает растровые индексы, Вы могли бы судить их.