Mysql多列加自定义排序(order by+field())
- 排序要求
需要排序的字段有:部门(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')
这次就没问题了,本地和服务器都显示出来了。这种方式特别方便,还可以自己决定部门排序的先后顺序。
欧了,就这样。