Mysql自定义排序  order by+field()

语法:

order by field(value,str1,str2,str3,str4,strn)

示例:
select * from driver_log order by field(name,‘zhangsan’,‘lisi’,‘wangwu’);

 

自定义排序 + 多字段排序

ORDER BY FIELD(`STATUS`,'1001','1002','1003') desc, ADD_DATE desc

单个字段降序 / 升序 排序:

select * from table order by id desc;

select * from table order by id asc;

多个字段排序:

select * from table order by id desc,name desc;

多字字段排序只需要添加多个排序条件,并且每个排序的条件之前用逗号分开。

order by id desc,name desc; 表示先按照id降序排序,再按照name降序排序。

order by id desc,name asc; 表示先按照id降序排序,再按照name升序排序。

 

例一:

排序要求:需要排序的字段有:部门(department),小组(team),职级(professionalClass)。

排序:

1.第一部分为职级值等于‘管理’的数据,排在最前面。
2.第二部分为,职级除了‘管理’之外剩下的数据。将这些数据先按部门排序,同一个部门的放在一起;
再按小组排序,把同部门同小组的放在一起;然后再按职级排序,职级高的放在前面低的放在后面。

方案一:

由于职级的值是没有顺序规则的,所以要在sql查询的时候自定义顺序再排序。

SELECT
    userName,department,
    team,professionalClass,
    assesser,finalLevel,
 case professionalClass when '管理'  THEN 1 else 2 end as orderClass, 
 case professionalClass 
    when '初级工程师C' then 1 
    when '初级工程师B' then 2 
    when '初级工程师A' then 3 
    when '中级工程师' then 4 
    when '中高级工程师' then 5 
    when '高级工程师' then 6 
 else 0 end as orderLevel 
FROM ws_performanceassess_maintest
ORDER BY orderClass,department,team,orderLevel desc

按理说这个代码是没有问题的(其实也真的没问题),我在本地也测了好好的,可是邪门的是一模一样的代码放到服务器上去,查出的就是乱序的。搞得我跟人家说的好好的,后来就直播打脸了。

到现在也不知道是为什么,在网上查了好多,表的编码格式应该没有错。还有的说是因为有中文,可是我这个职级字段的值就是有中文的。没办法就只能换另一种sql方案了。

方案二:

同样的要自定义职级的排序,但这次不是在查询的时候而是在排序中直接用field()函数自定义顺序。

SELECT
    userName,department,
    team,professionalClass,
    assesser,finalLevel
FROM ws_performanceassess_maintest
ORDER BY if(professionalClass='管理',0,1),
FIELD(department,'智能软件业务部','DVB产品业务部','研发设计部','综合测试部','预研产品业务部','IT部','自动化业务部'),
team,
FIELD(a.professionalClass,'高级工程师','中高级工程师','中级工程师','初级工程师A','初级工程师B','初级工程师C')

这次就没问题了,本地和服务器都显示出来了。这种方式特别方便,还可以自己决定部门排序的先后顺序。
————————————————

 


 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐