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

·  阅读 150

前言

工作中发现自己代码在测试时,查询结果不符合预期,问题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排序
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改