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

时间:2020-10-30 04:37:50

标签: mysql sql mysql-8.0

让我们说我们有一张桌子

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,3,2,5,4,1

如何使用Mysql实现此目标?

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

3 个答案:

答案 0 :(得分:1)

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

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

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

order by (case when id in (6, 3, 2) then id end) desc,
         created_at desc

答案 1 :(得分:0)

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顺序列出。

答案 2 :(得分:-1)

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

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