Order by 多条件排序
程序员文章站
2024-03-05 16:48:37
...
首先了解一下基础知识:
- order by可以按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),如果缺省,则是升序。
- order by中如果定义了多个字段,则按照字段的先后顺序排序。
- order by通常放在SQL语句的最后。
最近由于需要对一张表进行排序,由前端传递排序字段以及排序规则,由于忽视了多条件排序规则,所以导致BUG。
首先来看一下表数据(简化)
id | emp_code | create_date |
1 | 100101 | 2015-01-02 |
2 | 100102 | 2017-04-12 |
3 | 100103 | 2016-03-14 |
4 | 100104 | 2018-11-06 |
5 | 100105 | 2018-06-22 |
原业务是查询功能,所以我用了以下SQL,本意是想默认以创建时间降序查询,但是也支持前端emp_code排序
SELECT
id,
emp_code,
create_date
FROM
A
ORDER BY
create_date desc
<if test="sortName != null and sortName != ''">
,${sortName} ${sortOrder}
</if>
so,联调的时候,SQL执行是没问题的,但是总是不能按照emp_code去执行,这里我忽视了一条总要的规则:
多条件查询,首先从左到右执行排序,当遇到第一个排序字段值相同,再继续以第二个排序字段进行排序。
知道上面这条,我对我的SQL进行变化:
SELECT
id,
emp_code,
create_date
FROM
A
<if test="sortName == null or sortName == ''">
ORDER BY create_date desc
</if>
<if test="sortName != null and sortName != ''">
ORDER BY ${sortName} ${sortOrder}
</if>
这样既满足无排序条件下按照创建日期倒序排列,又能满足当前端传递参数时,按照前端要求进行排序。
推荐阅读