首页 > 解决方案 > MySQL - 仅对前 3 行进行排序

问题描述

我的客户希望在他的 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”。

标签: phpmysqlsqlwordpress

解决方案


我会使用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默认情况下会删除重复项,因此它将防止相同的帖子在列表中重复。


推荐阅读