问题:做项目时发现个问题,对版本号列排序时,界面显示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 可以使用