踩坑系列——mysql查詢使用group_concat()結果被截斷問題

背景:
項目中有一個統計報表,結果需要展示成這種,並按分類分頁查詢:
在這裏插入圖片描述
表中可能多條數據對應相同的分類,但是反饋狀態不一樣,一開始的實現思路是這樣的:

(1)查詢表然後按分類進行group分組,並將其中一個字段使用group_concat()拼接。sql及查詢結果如下:

 select first_category_name,second_category_name,GROUP_CONCAT(sku_no) as sku_no_list
 from table
 where 1=1 and status in (2,3)
 group by first_category_name,second_category_name

在這裏插入圖片描述
這樣就得到每個分類都有哪些對應的數據,然後將sku_no_list按逗號拆分,查詢每個sku_no對應記錄的狀態,做統計。

問題:
測試環境驗證覈對數據正確,但是上線後,正式環境統計的各分類總數,有些是不正確,偏少,有些是正確的。一開始以爲是group查詢分類之後的處理代碼有問題,但是想到測試環境是正確的,又有點不服氣。

排查:
(1)以“隱形眼鏡”這個分類爲準,執行上面的group統計,將sku_no_list貼到word裏面,將,替換成換行,再貼到excel裏面,
(2)單獨查詢second_category_name=隱形眼鏡的sku_no,將sku_no也貼到excel中
(3)比較excel中兩列數據,發現使用group統計出來的比單獨查詢的要少了一部分

於是比較好奇,group_concat()的結果爲什麼會變少?難道有長度限制,被截取了?

查資料,果然是這樣!!
mysql的group_concat默認連接長度爲1024字符,也就是說你連接後的結果超過1024字符,它只會顯示這麼長,其餘部分都會被截取丟掉。

解決方案:
(1)執行以下sql語句:
SET GLOBAL group_concat_max_len = 102400; //其中數字大小可修改

(2)在MySQL配置文件(my.ini)中加: group_concat_max_len = -1 # -1爲最大值或填入你要的最大長度,並重啓mysql

但是第一個方法有一個缺點,重啓服務後設置失效,而第二個方法還需要走流程找DBA去修改線上數據庫配置,太麻煩了。於是只能採取別的方法,迂迴實現。

(3)程序處理

更改分組查詢,去掉group_concat:

select first_category_name,second_category_name
from table
where 1=1 and status in (2,3)
group by first_category_name,second_category_name

然後循環分組結果,再將類目名稱作爲條件查詢數據,對查詢出的數據進行統計。線上驗證數據正確。

總的來說還是知識不到位,數據量少的時候沒測出來,踩坑了。。。

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