有条件地混合 ORDER BY
Conditionally mixing ORDER BY
我有一个 MySQL table,我希望其中的一部分以不同的方式排序。例如,我想要以下结果集:
+----+
| id |
+----+
| 1 | #ascending
| 2 |
| 3 |
| 4 |
| 8 | #descending
| 7 |
| 6 |
| 5 |
+----+
我基本上想做类似的事情:
ORDER BY
WHEN id <= 4 THEN
id ASC
ELSE
id DESC
END;
这当然是废话。有一个合理的等价物吗?我试过使用 UNION
,但子查询顺序被忽略了。
您可以使用两阶段订购流程;第一部分根据 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
有人发布了此答案但已将其删除;我重新发布,因为它仍然是一个有效的答案。
您可以将一个规则限制为一个子集,而下一个规则将应用于其余部分,而不是将顺序更改放入 ELSE
子句中:
ORDER BY id <= 4 DESC,
CASE WHEN id <= 4 THEN id END ASC,
id DESC;
我有一个 MySQL table,我希望其中的一部分以不同的方式排序。例如,我想要以下结果集:
+----+
| id |
+----+
| 1 | #ascending
| 2 |
| 3 |
| 4 |
| 8 | #descending
| 7 |
| 6 |
| 5 |
+----+
我基本上想做类似的事情:
ORDER BY
WHEN id <= 4 THEN
id ASC
ELSE
id DESC
END;
这当然是废话。有一个合理的等价物吗?我试过使用 UNION
,但子查询顺序被忽略了。
您可以使用两阶段订购流程;第一部分根据 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
有人发布了此答案但已将其删除;我重新发布,因为它仍然是一个有效的答案。
您可以将一个规则限制为一个子集,而下一个规则将应用于其余部分,而不是将顺序更改放入 ELSE
子句中:
ORDER BY id <= 4 DESC,
CASE WHEN id <= 4 THEN id END ASC,
id DESC;