GROUP_CONCAT(expr) 函數會從 expr 中連接所有非 NULL 的字符串。如果沒有非 NULL 的字符串,那么它就會返回 NULL。語法如下:
GROUP_CONCAT 語法規則
它在遞歸查詢中用的比較多,但要使用好它并不容易。所以讓我們一起來看看吧:
假設有這樣一張領接表模型的樹型表 t_region,它的基本結構如下:
字段
類型
大小
說明
REGION_ID
int
11
行政地區ID
PARENT_ID
int
11
上級行政地區ID
1 使用示例
【1】以逗號最為默認的連接字符
SELECT GROUP_CONCAT(a.REGION_ID) FROM t_region a;
連接所有非 NULL 的字符串
【2】可以使用 DISTINCT 過濾重復的值,也可以加入 ORDER BY 對值進行排序,還可以使用 SEPARATOR 指定分隔符:
SELECT GROUP_CONCAT( DISTINCT a.REGION_ID ORDER BY a.REGION_ID DESC SEPARATOR ' ')
FROM t_region a;
加入 DISTINCT 、 ORDER BY 與 SEPARATOR
這里的返回值以過濾了重復值,并且倒序排序,還使用了空格作為分隔符。
2 最大值限制
GROUP_CONCAT() 是有最大長度限制的,默認值是 1024。
可以通過 group_concat_max_len 參數進行動態設置。參數范圍可以是 Global 或 Session。
設置語法如下:
修改 group_concat_max_len 參數
值是無符號整型,最大值與版本位數有關:
版本
最小值
最大值
32 位
4
4294967295
64 位
4
18446744073709551615
如果 group_concat_max_len 的值被設置為小等于 512,那么 GROUP_CONCAT 的返回值類型是 VARCHAR 或 VARBINARY;否則是 TEXT 或 BLOB。
實際上,group_concat_max_len 的值可以設的更大,但會受到參數max_allowed_packet 的限制。
很多人不知道這一點,因為它只有在數據量較大的情況下才會出現。
【1】使用默認值的情況:
SELECT GROUP_CONCAT(a.REGION_ID) FROM t_region a;
使用默認值的返回結果
可以看出,當總長度達到 1024 后,后面的記錄就被截斷掉咯。
【2】group_concat_max_len 設置為最大值:
SET SESSION group_concat_max_len=18446744073709551615;
SELECT GROUP_CONCAT(a.REGION_ID) FROM t_region a;
group_concat_max_len 設置為最大值的返回結果
這樣設置之后,一般情況下,GROUP_CONCAT 就不會再出現字符串被截斷的情況啦O(∩_∩)O~