在单个查询中以特定条件升序/降序排序

时间:2015-10-08 10:52:57

标签: mysql mysql-workbench

我有一张表格如下:

+-----+-------------+
| id  | status_code |
+-----+-------------+
|  1  |         200 |
|  2  |         301 |
|  3  |         404 |
|  4  |         404 |
|  5  |           0 |
|  6  |         200 |
|  7  |         200 |
+-----+-------------+

如何在单个查询中获得以下结果?

1)按状态代码顺序排序,但结果顶部为0。

+-----+-------------+
| id  | status_code |
+-----+-------------+
|  5  |           0 |
|  4  |         404 |
|  3  |         404 |
|  2  |         301 |
|  7  |         200 |
|  6  |         200 |
|  1  |         200 |
+-----+-------------+

2)按状态代码排序,但在结果的末尾为0。

+-----+-------------+
| id  | status_code |
+-----+-------------+
|  1  |         200 |
|  6  |         200 |
|  7  |         200 |
|  2  |         301 |
|  3  |         404 |
|  4  |         404 |
|  5  |           0 |
+-----+-------------+

3 个答案:

答案 0 :(得分:2)

要让0位于顶部:

ORDER BY status_code = 0 DESC, status_code DESC

要在底部获取0

ORDER BY status_code = 0 ASC, status_code ASC

这是有效的,因为比较运算符会为0返回false1会返回true

答案 1 :(得分:1)

只需包含多个键即可。在MySQL中,这很容易:

order by (status_code = 0) desc, status_code desc

第一个案例。

order by (status_code = 0) asc, status_code asc

在第二个。

这是如何工作的? MySQL将布尔表达式视为数字上下文中的整数,0表示false,1表示true。因此,(status = 0)变为0或1. ascdesc只是确定哪个先行。

答案 2 :(得分:0)

您可以尝试这样: -

select * from yourtable 
order by (status_code = 0) desc, status_code desc