有条件地混合 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

Demo on SQLFiddle

有人发布了此答案但已将其删除;我重新发布,因为它仍然是一个有效的答案。

您可以将一个规则限制为一个子集,而下一个规则将应用于其余部分,而不是将顺序更改放入 ELSE 子句中:

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

Demo on SQLFiddle