【问题标题】:MySQL - Sort the FIRST 3 rows onlyMySQL - 仅对前 3 行进行排序
【发布时间】:2019-08-18 16:29:03
【问题描述】:

我的客户希望在他的 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 个溢价之后)需要从字面上选择与搜索匹配的所有内容,这意味着它也可以选择溢价帖子,所以我不能使用“NOT LIKE @987654322 @"。

【问题讨论】:

  • 为了代码可读性,我只使用 2 个查询(选择 3 个优质产品并选择所有其他产品)。
  • 但是通过选择所有其他产品,它可能会带来我在之前搜索中选择的相同产品。
  • 只使用逆向的WHERE(例如WHERE posts.category != 'premium'
  • “第二次搜索”需要从字面上选择与搜索查询匹配的所有内容,因此它也可以包含优质帖子。我不能使用“LIKE NOT”。

标签: php mysql sql wordpress


【解决方案1】:

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

【讨论】:

  • 我试过了,但问题是他想在其余的搜索中也有优质帖子,我会根据它更新我的问题...
  • @RaySantos 你可以从第二个选择中删除posts.category NOT LIKE 'premium' 条件。
  • 好吧,但是如果我首先按溢价订购这 2 个选择的 UNION,而第二个选择获得更多溢价,那么它将首先显示所有溢价,我的意思是超过 3,对吗?
  • 不,它只会首先显示第一个查询的溢价,因为其他查询(即使它们是溢价)将其 premium 值设置为 0。
  • 哦,我知道了,我马上测试一下,然后我会把你的答案标记为正确的,谢谢!
【解决方案2】:

你可以只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 负责删除查询中的重复项。外部查询首先放置优质帖子,然后按日期降序排列。

【讨论】:

    猜你喜欢
    • 2015-02-23
    • 2014-04-18
    • 2016-05-03
    • 2012-09-14
    • 2014-03-12
    • 2021-11-06
    • 2010-11-02
    • 2012-04-09
    相关资源
    最近更新 更多