MySQL: Нахождение располагает в ряд, которые не принимают участие в отношениях

Чтобы уточнить. Важно знать, что:

  • Да, вы должны передать объект Date Javascript.
  • Да, это должно быть ISODate friendly
  • Да, из моего опыта, чтобы это работало, вам нужно манипулировать датой ISO
  • Да, работает с датами, как правило, всегда утомительный процесс, а mongo не является исключением

. Вот рабочий фрагмент кода, где мы немного манипулируем датами для обеспечения Mongo (здесь я использую mongoose и хотите, чтобы результаты для строк, атрибут даты которых меньше (до) даты, заданной как параметр myDate), могут корректно обрабатывать:

var inputDate = new Date(myDate.toISOString());
MyModel.find({
    'date': { $lte: inputDate }
})
24
задан tliff 13 February 2009 в 00:33
поделиться

4 ответа

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

Снова, необходимо протестировать каждое решение и сравнить результаты, чтобы быть уверенными. Это - пустая трата времени для выбора любого решения, не измеряя уровень.

35
ответ дан Bill Karwin 28 November 2019 в 23:32
поделиться

Мало того, что Ваш запрос работает, это - правильный подход к проблеме, как указано. Возможно, можно ли найти другой способ приблизиться к проблеме? Простой ПРЕДЕЛ на Ваш внешний выбор должен быть очень быстрым даже для больших таблиц, например.

4
ответ дан dwc 28 November 2019 в 23:32
поделиться

Замеченный Ваша объединяющая таблица, таким образом, да, это похоже на правильное решение. Вы эффективно "вычитаете" набор идентификаторов фильма в ЗАМЕЧЕННОМ (для пользователя) от всего количества в ФИЛЬМАХ, приводя к невидимым фильмам для того пользователя.

Это называют "отрицательным соединением", и печально НЕ В или НЕ СУЩЕСТВУЕТ, наилучшие варианты. (Я хотел бы видеть отрицательный синтаксис соединения, который был подобен ВНУТРЕННИМ/ВНЕШНИМ/ЛЕВЫМ/ПРАВИЛЬНЫМ соединениям, но где НА пункте мог быть оператор вычитания).

решение @Bill без подзапроса должно работать, хотя, поскольку он отметил, что это - хорошая идея протестировать Ваше решение на производительность оба пути. Я подозреваю, что подзапрос или нет, весь индекс SEEN.ID (и конечно весь индекс MOVIE.ID) будет оцененным оба пути: это будет зависеть от того, как оптимизатор обрабатывает его оттуда.

4
ответ дан Godeke 28 November 2019 в 23:32
поделиться

Если Ваш DBMS поддерживает растровые индексы, Вы могли бы судить их.

0
ответ дан John Smith 28 November 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: