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