我有一张表格如下:
+-----+-------------+
| 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 |
+-----+-------------+
答案 0 :(得分:2)
要让0
位于顶部:
ORDER BY status_code = 0 DESC, status_code DESC
要在底部获取0
:
ORDER BY status_code = 0 ASC, status_code ASC
这是有效的,因为比较运算符会为0
返回false
而1
会返回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. asc
和desc
只是确定哪个先行。
答案 2 :(得分:0)
您可以尝试这样: -
select * from yourtable
order by (status_code = 0) desc, status_code desc