按顺序有条件混合

w80xi6nr  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(647)

我有一个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 ,但忽略子查询顺序。

q7solyqu

q7solyqu1#

您可以使用两阶段订购流程;第一部分按是否 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
5

sqlfiddle演示

fafcakar

fafcakar2#

有人发布了这个答案,但删除了它;我重新发布是因为它仍然是一个有效的答案。
而不是把订单变成 ELSE 子句中,可以将一个规则限制为一个子集,下一个规则将应用于其余规则:

ORDER BY id <= 4 DESC,
         CASE WHEN id <= 4 THEN id END ASC,
         id DESC;

sqlfiddle演示

相关问题