MySQL - сортировать только первые 3 строки - PullRequest
5 голосов
/ 28 марта 2019

Мой клиент хочет, чтобы поиск на его веб-сайте WordPress показывал 3 первых результата из определенной категории (продукты премиум-класса), а затем сортировал остальные результаты по релевантности.

Это должно быть примерно так:

Поиск: зеленое яблоко

  1. зеленый ананас (высший сорт)
  2. красное яблоко (высший сорт)
  3. яблочный пирог(премиум)
  4. зеленое яблоко
  5. большое зеленое яблоко
  6. маленькое зеленое яблоко

Я думаю, есть ли что-то, что считает выбранныйСтроки для создания условия OrderBy, как показано ниже:

SELECT * 
FROM `posts` 
ORDER BY ( 
    CASE WHEN `posts.category` LIKE 'premium' AND COUNT(ROW) < 4 
        THEN 0 
        ELSE 1 
    END ), 
    `posts.post_date` DESC

Obs .: В остальной части поиска (после первых 3 премий) необходимо выбрать буквально все, что соответствует поиску, это означает, что он можеттакже выбирайте посты премиум-класса, поэтому я не могу использовать "НЕ НРАВИТСЯ premium".

Ответы [ 2 ]

3 голосов
/ 28 марта 2019

Вы можете просто UNION два запроса, например:

(SELECT p.*, 1 is_premium FROM posts p WHERE category = 'premium' ORDER BY post_date DESC LIMIT 3)
UNION
(SELECT p.*, category = 'premium' FROM posts)
ORDER BY is_premium, post_date DESC

Первый запрос выбирает 3 самых последних премии posts. Второй запрос выбирает все сообщения. UNION заботится об удалении дубликатов по запросам. Внешний запрос ставит первоклассные посты первыми, а заказы - по убыванию.

3 голосов
/ 28 марта 2019

Я бы использовал запрос UNION, чтобы выбрать 3 продукта премиум-класса, а затем остальные:

SELECT * 
FROM ((SELECT 1 AS premium, posts.* 
       FROM posts
       WHERE `posts.category` LIKE 'premium'
       ORDER BY post_date_desc
       LIMIT 3)
      UNION
      (SELECT 0 AS premium, posts.*
       FROM posts)
     ) p
GROUP BY p.ID
ORDER BY premium DESC, `p.post_date` DESC

UNION по умолчанию удаляет дубликаты, чтобы предотвратить повторение одного и того же сообщения в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...