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;

MySQL 解决空字符排序问题_第1张图片

前端处理后展示:

MySQL 解决空字符排序问题_第2张图片

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

MySQL 解决空字符排序问题_第3张图片

 

那怎样让用户在升序时看到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;

 

MySQL 解决空字符排序问题_第4张图片

 

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

你可能感兴趣的:(mysql)