我有一个MySQL表,我希望其中的一部分以不同的方式排序。例如,我想要以下结果集:
+----+
| id |
+----+
| 1 | #ascending
| 2 |
| 3 |
| 4 |
| 8 | #descending
| 7 |
| 6 |
| 5 |
+----+我本质上想做一些类似的事情:
ORDER BY
WHEN id <= 4 THEN
id ASC
ELSE
id DESC
END;这当然是无稽之谈。有没有感官上的等价物?我尝试过使用UNION,但是忽略了子查询顺序。
发布于 2020-07-05 08:53:10
您可以使用两阶段排序过程;第一部分按id是否小于或等于4排序,第二部分按id (对于id <= 4)或-id (对于id > 4)排序,以便大于4的值按降序排序:
SELECT *
FROM data
ORDER BY id <= 4 DESC,
CASE WHEN id <= 4 THEN id ELSE -id END输出:
id
1
2
3
4
8
7
6
5Demo on SQLFiddle
发布于 2020-07-07 07:24:32
有人发布了这个答案,但将其删除了;我之所以重新发布,是因为它仍然是一个有效的答案。
您可以将一个规则限制为一个子集,下一条规则将应用于其余规则,而不是将顺序更改工作到ELSE子句中:
ORDER BY id <= 4 DESC,
CASE WHEN id <= 4 THEN id END ASC,
id DESC;Demo on SQLFiddle
https://stackoverflow.com/questions/62735803
复制相似问题