MySQL多字段排序,降序这么写正确吗?【ORDER BY `c1`, `c2` DESC】

294 阅读2分钟

前言

工作中发现自己代码在测试时,查询结果不符合预期,问题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排序