MySQL:先按特定项目排序,然后按时间排序

问题描述

让我们说我们有一张桌子

names
-------------------
id     name      created_at
1      alpha     2020-10-23 17:30:35
2      beta      2020-10-24 17:30:35
3      gamma     2020-10-25 17:30:35
4      kilo      2020-10-26 17:30:35
5      charlie   2020-10-27 17:30:35
6      hector    2020-10-28 17:30:35

我想按固定数组对前几行进行排序,假设6,3,2并按created_at进行降序排列。 因此,我期望的顺序为6,2,5,4,1

如何使用MysqL实现此目标?

我尝试使用field(),但无法使其与另一列配合工作。

解决方法

FIELD()有点棘手,因为如果没有匹配项,它将返回0。您可以构造一个满足您需要的表达式:

order by coalesce(nullif(field(id,6,3,2),0),999999),created_at desc

如果您知道ID始终是固定值的降序,则可以使用:

order by (case when id in (6,2) then id end) desc,created_at desc
,
SELECT * FROM names ORDER BY (
CASE
    WHEN id = 6 THEN 1
    WHEN id = 3 THEN 2
    WHEN id = 2 THEN 3
    ELSE 4
END,created_at DESC
)

CASE语句确保列出的前3个项目分别是6、3和2,其余按created_at DESC顺序列出。

,

一种选择是编写一个case表达式,如下所示

  select *
    from names
order by case when id in (6,2) then 0
              else 1
          end asc,created_at desc