如何使用 "ORDER BY FIELD" 对 SQL 的结果进行排序
How to use "ORDER BY FIELD" to sort the result of a SQL
如果有如下数据;
id cnt_stamp
1 999
2 3
3 9
4 3
5 1000
6 30
如果输入的顺序是 (4, 1, 2, 3),我只想得到 (3, 999, 3, 9)。
为此,我创建了一个 SQL
SELECT `cnt_stamp`
FROM `stm_events`
ORDER BY FIELD(`id`, 4, 1, 2, 3);
但它 returns (1000, 30, 3, 999, 3, 9) 而不是。我应该如何修复我的 SQL 以实现我的目标?感谢您抽出宝贵时间。
FIELD
会将 NULL
分配给任何不匹配的 id
,默认情况下,空值首先在 MySQL 中排序。如果您根本不想看到不匹配的项目,您可以添加一个 WHERE
子句:
SELECT cnt_stamp
FROM stm_events
WHERE id IN (1, 2, 3, 4)
ORDER BY FIELD(id, 4, 1, 2, 3);
如果您想查看所有数据,在末尾有不匹配的 id
值,则反转字段列表的顺序并降序排序:
SELECT cnt_stamp
FROM stm_events
ORDER BY FIELD(id, 3, 2, 1, 4) DESC;
使用COALESCE
函数:
SELECT `cnt_stamp`
FROM `stm_events`
ORDER BY COALESCE(`id`,FIELD(`id`,4,1,2,3));
如果有如下数据;
id cnt_stamp
1 999
2 3
3 9
4 3
5 1000
6 30
如果输入的顺序是 (4, 1, 2, 3),我只想得到 (3, 999, 3, 9)。 为此,我创建了一个 SQL
SELECT `cnt_stamp`
FROM `stm_events`
ORDER BY FIELD(`id`, 4, 1, 2, 3);
但它 returns (1000, 30, 3, 999, 3, 9) 而不是。我应该如何修复我的 SQL 以实现我的目标?感谢您抽出宝贵时间。
FIELD
会将 NULL
分配给任何不匹配的 id
,默认情况下,空值首先在 MySQL 中排序。如果您根本不想看到不匹配的项目,您可以添加一个 WHERE
子句:
SELECT cnt_stamp
FROM stm_events
WHERE id IN (1, 2, 3, 4)
ORDER BY FIELD(id, 4, 1, 2, 3);
如果您想查看所有数据,在末尾有不匹配的 id
值,则反转字段列表的顺序并降序排序:
SELECT cnt_stamp
FROM stm_events
ORDER BY FIELD(id, 3, 2, 1, 4) DESC;
使用COALESCE
函数:
SELECT `cnt_stamp`
FROM `stm_events`
ORDER BY COALESCE(`id`,FIELD(`id`,4,1,2,3));