MySQL несколько условий ORDER BY с ограничением для каждого условия - PullRequest
0 голосов
/ 13 июля 2020

У меня есть объект Product (сопоставлен с таблицей product) со следующими полями:

  • createdAt (дата создания)
  • numberOfLikes (количество полученных лайков )
  • numberOfComments (количество полученных комментариев)

Мне нужно создать панель управления с разбивкой на страницы с 20 элементами на каждой странице (и без дубликатов). Прямо сейчас я выполняю 3 разных запроса для извлечения, а затем объединяю следующие элементы в один список:

  • 10 самых последних продуктов (ORDER BY createdAt DES C)
  • 5 самых популярных продуктов (ЗАКАЗАТЬ ПО количеству лайков DES C) <== Я вручную исключаю идентификаторы из первого запроса с помощью <code>WHERE id NOT IN
  • топ-5 продуктов с наибольшим количеством комментариев (ПОРЯДОК ПО количеству комментариев DES C) <== Я вручную исключаю идентификаторы из первого и второго запросов с помощью <code>WHERE id NOT IN

Я хотел бы создать один запрос для извлечения всех 20 предыдущих пунктов. Возможно ли это?

Я использую MySQL с Doctrine (Symfony), и мне было бы интересно найти Doctrine -совместимое решение .

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Это требует использования UNION, что означает, что у вас не может быть Doctrine -совместимого решения.

Основная методология будет такой же, как и то, что вы делаете на уровне приложения, за исключением уродливее. Чтобы получить точно такое же поведение, вам нужно будет сделать что-то вроде

SELECT [text of first query]
UNION
SELECT [text of second query]
WHERE `id` NOT IN (
  SELECT `id` FROM (SELECT [text of first query])
)
UNION
SELECT [text of third query]
WHERE `id` NOT IN (
  SELECT `id` FROM (SELECT [text of first query])
)
AND `id` NOT IN (
  SELECT (SELECT `id` FROM [text of second query])
)

Это означает, что первый запрос выполняется трижды независимо, а второй запрос выполняется дважды.

0 голосов
/ 13 июля 2020

Я не думаю, что это возможно сделать в одном запросе. Я бы использовал комбинацию методов массива, если общее количество сообщений ограничено (например, на панели управления отображается только 100 сообщений).

...