MySQL 解决空字符排序问题

问题:做项目时发现个问题,对版本号列排序时,界面显示5.5.53.0居然在0.0.0.2前面

分析流程:

原有sql写法:

mysql> select vendor,application, GROUP_CONCAT(distinct applicationversion separator '-;-' ) from applications where INSTR(vendor,"") and INSTR(application,"") and (lastuse< 1590661915 and lastuse> 1590057115) GROUP BY vendor,application order by applicationversion ASC limit 0,10;

前端处理后展示:

表面看错误的内在原因是:GROUP BY vendor,application出现的第一行数据的applicationversion值为空字符,导致GROUP_CONCAT结果为-;-5.5.53.0,按照ASCII码表,-比0小(当表中group by的那一列有多个重复记录,group by取得是第一个匹配的数据)

 

那怎样让用户在升序时看到5.5.53.0在0.0.0.2之后呢??

思路:可以将待排序的那列的NULL与空字符转成NULL,GROUP_CONCAT对NULL是不处理的,这样GROUP_CONCAT处理后得到的GROUP_CONCAT(distinct (case when  isnull(applicationversion) || applicationversion='' THEN null else applicationversion end) separator '-;-' ) as temp值就不会以空字符开头,不会出现-;-5.5.53.0 这种结果,再将对待排序列(order by applicationversion)的排序转成对GROUP_CONCAT处理后的结果列(order by temp)排序。

新的sql写法:

select vendor,application,GROUP_CONCAT(distinct (case when  isnull(applicationversion) || applicationversion='' THEN null else applicationversion end) separator '-;-' ) as temp from applications where INSTR(vendor,"") and INSTR(application,"") and (lastuse< 1590661915 and lastuse> 1590057115) GROUP BY vendor,application order by temp ASC limit 0,10;

 

 

注:一般不支持在select中与 where语句 继续使用别名,但是在order by group by 可以使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值