问题描述
让我们说我们有一张桌子
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