优先于列的条件排序

Conditional ordering with priority to a column

我有一个包含 4 列的 table:

  1. 产品编号
  2. 已赞助
  3. 排名
  4. 人气得分

我想获得 RankPopularityScore 订购的前 20 名产品。但是,仅当 IsSponsored = 1 时才会考虑 Rank。 我试过在 ORDER BY 子句中使用 CASE 。类似于:

SELECT ProductID
FROM ProductTable 
ORDER BY
CASE WHEN IsSponsored = 1 THEN RANK END ASC,
CASE WHEN IsSponsored = 0 THEN PopularityScore END DESC
LIMIT 20;

我面临的问题是,由于 IsSponsored = 0 的行数 >> IsSponsored = 1 的行数和限制 20,MySQL 获取 [=17 的行=] 按 PopularityScore 排序。 我想要的是获得按排名排序的所有赞助产品,然后辅以按人气得分排序的非赞助产品。

在所有三个上尝试条件逻辑:

ORDER BY (IsSponsored = 1) DESC,
         (CASE WHEN IsSponsored = 1 THEN RANK END) ASC,
         PopularityScore DESC;

第一个键是布尔表达式:计算结果为真 (1) 或假 (0)。我从第三个键中删除了 CASE,因为它是多余的——如果你愿意,你可以把它放回去。