記錄mysql函數GROUP_CONCAT用法及踩坑點


concat()函數:

1、功能:

將多個字符串連接成一個字符串。

2、語法:

concat(str1, str2,...)

返回結果為連接參數產生的字符串,如果有任何一個參數為null,則返回值為null。

concat_ws()函數:

1、功能:

和concat()一樣,將多個字符串連接成一個字符串,但是可以一次性指定分隔符~(concat_ws就是concat with separator)

2、語法:

concat_ws(separator, str1, str2, ...)

說明:第一個參數指定分隔符。需要注意的是分隔符不能為null,如果為null,則返回結果為null。

group_concat函數:

1、功能:

將group by產生的同一個分組中的值連接起來,返回一個字符串結果。

2、語法:

group_concat( [distinct] 要連接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )

說明:通過使用distinct可以排除重復值;如果希望對結果中的值進行排序,可以使用order by子句;separator是一個字符串值,缺省為一個逗號。

下面主要看一下group_concat函數

表中數據如下:

 

 

如圖可知,一個用戶可以有多種角色,現在要把多種角色合並為一條數據展示。

sql:

SELECT
    user_no,
    GROUP_CONCAT( DISTINCT role_name ) AS role_name 
FROM
    report_user_role_info 
GROUP BY
    user_no;

查詢結果如下:

 

 

可以達到預期效果。

如果想要根據角色對應id對這三個角色進行排序,比如降序預期結果應該是“順風車車主用戶(3),乘客用戶(2),注冊用戶(1)”來排序:

sql:

SELECT
    user_no,
    GROUP_CONCAT( DISTINCT role_name ORDER BY role_id desc ) AS role_name
FROM
    report_user_role_info 
GROUP BY
    user_no;

查詢結果如下:

 

 如果只想展示一個或者兩個角色,可以使用SUBSTRING_INDEX函數,SUBSTRING_INDEX(a,b,c),a參數代表要截取的字符串,b參數代表分隔符,c參數代表截取幾個字符

sql(截取兩個):

SELECT
    user_no,
    SUBSTRING_INDEX(GROUP_CONCAT( DISTINCT role_name ORDER BY role_id desc ),',',2) AS role_name
FROM
    report_user_role_info 
GROUP BY
    user_no;

查詢結果如下:

 

踩坑記錄:

當數據太大,group_concat超出了默認值1024,超過就會截斷,group_concat查詢出來的數據就是不全。

解決:

1.查看當前 mysql group_concat_max_len:
進入mysql狀態,輸入:

show variables like 'group_concat_max_len';

結果如下:

 

可以看到當前值為1024.

2.在MySQL配置文件中添加配置:group_concat_max_len = -1 (-1為最大值或根據實際需求設置長度),配置后需要重啟MySQL服務
如果是生產環境下,不能擅自重啟MySQL服務,則可以通過語句設置group_concat的作用范圍,如:

set session group_concat_max_len = -1 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM