背景:
項目中有一個統計報表,結果需要展示成這種,並按分類分頁查詢:
表中可能多條數據對應相同的分類,但是反饋狀態不一樣,一開始的實現思路是這樣的:
(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
然後循環分組結果,再將類目名稱作爲條件查詢數據,對查詢出的數據進行統計。線上驗證數據正確。
總的來說還是知識不到位,數據量少的時候沒測出來,踩坑了。。。