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 可以使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章