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')

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

欧了,就这样。