前言
工作中发现自己代码在测试时,查询结果不符合预期,问题SQL大致如下,本来是想查询根据字段降序后结果最大的那一条
SELECT xxx FROM xxx WHERE xxx ORDER BY col1, col2 DESC LIMIT 1;
,但是测试结果有些CASE不符合预期,定位到这条SQL看了好久其实感觉没有什么问题,但查了一下相关资料后......
结论
- 不能只在最后一个字段添加
DESC
,每个字段都需添加DESC
- 不添加字段默认按照
ASC
排序 col1, col2 DESC
表达的含义是,先对col1 ASC
排序,再对col2 DESC
排序 多字段降序正确写法
SELECT xxx FROM xxx WHERE xxx ORDER BY `col1` DESC, `col2` DESC, ...
验证
查看表内现有数据
mysql> select * from test;
+-----+-----+
| id1 | id2 |
+-----+-----+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
+-----+-----+
9 rows in set (0.01 sec)
不添加任何限定排序
- 结果: 先按照第一个字段升序排序(ASC),再按照第二个字段降序排序(ASC),默认升序
mysql> select * from test order by id1, id2;
+-----+-----+
| id1 | id2 |
+-----+-----+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
+-----+-----+
9 rows in set (0.00 sec)
只在最后一个字段添加DESC
- 结果: 先按照第一个字段升序排序(ASC),再按照第二个字段降序排序(DESC)
mysql> select * from test order by id1, id2 desc;
+-----+-----+
| id1 | id2 |
+-----+-----+
| 1 | 3 |
| 1 | 2 |
| 1 | 1 |
| 2 | 3 |
| 2 | 2 |
| 2 | 1 |
| 3 | 3 |
| 3 | 2 |
| 3 | 1 |
+-----+-----+
9 rows in set (0.00 sec)
每一个字段都添加DESC
- 结果: 先按照第一个字段升序排序(DESC),再按照第二个字段降序排序(DESC)
mysql> select * from test order by id1 desc, id2 desc;
+-----+-----+
| id1 | id2 |
+-----+-----+
| 3 | 3 |
| 3 | 2 |
| 3 | 1 |
| 2 | 3 |
| 2 | 2 |
| 2 | 1 |
| 1 | 3 |
| 1 | 2 |
| 1 | 1 |
+-----+-----+
9 rows in set (0.00 sec)
总结
- 多字段排序时需注意,如果是降序,需要在每一个排序字段后添加
DESC
,否则会按照默认的ASC
排序