GROUP_CONCAT(expr) 函數(shù)會(huì)從 expr 中連接所有非 NULL 的字符串。如果沒有非 NULL 的字符串,那么它就會(huì)返回 NULL。語(yǔ)法如下:

它在遞歸查詢中用的比較多,但要使用好它并不容易。所以讓我們一起來看看吧:
假設(shè)有這樣一張領(lǐng)接表模型的樹型表 t_region,它的基本結(jié)構(gòu)如下:
| 字段 | 類型 | 大小 | 說明 |
|---|---|---|---|
| REGION_ID | int | 11 | 行政地區(qū)ID |
| PARENT_ID | int | 11 | 上級(jí)行政地區(qū)ID |
1 使用示例
【1】以逗號(hào)最為默認(rèn)的連接字符
SELECT GROUP_CONCAT(a.REGION_ID) FROM t_region a;

【2】可以使用 DISTINCT 過濾重復(fù)的值,也可以加入 ORDER BY 對(duì)值進(jìn)行排序,還可以使用 SEPARATOR 指定分隔符:
SELECT GROUP_CONCAT( DISTINCT a.REGION_ID ORDER BY a.REGION_ID DESC SEPARATOR ' ')
FROM t_region a;

這里的返回值以過濾了重復(fù)值,并且倒序排序,還使用了空格作為分隔符。
2 最大值限制
GROUP_CONCAT() 是有最大長(zhǎng)度限制的,默認(rèn)值是 1024。
可以通過 group_concat_max_len 參數(shù)進(jìn)行動(dòng)態(tài)設(shè)置。參數(shù)范圍可以是 Global 或 Session。
設(shè)置語(yǔ)法如下:

值是無(wú)符號(hào)整型,最大值與版本位數(shù)有關(guān):
| 版本 | 最小值 | 最大值 |
|---|---|---|
| 32 位 | 4 | 4294967295 |
| 64 位 | 4 | 18446744073709551615 |
如果 group_concat_max_len 的值被設(shè)置為小等于 512,那么 GROUP_CONCAT 的返回值類型是 VARCHAR 或 VARBINARY;否則是 TEXT 或 BLOB。
實(shí)際上,group_concat_max_len 的值可以設(shè)的更大,但會(huì)受到參數(shù)max_allowed_packet 的限制。
很多人不知道這一點(diǎn),因?yàn)樗挥性跀?shù)據(jù)量較大的情況下才會(huì)出現(xiàn)。
【1】使用默認(rèn)值的情況:
SELECT GROUP_CONCAT(a.REGION_ID) FROM t_region a;

可以看出,當(dāng)總長(zhǎng)度達(dá)到 1024 后,后面的記錄就被截?cái)嗟艨?/p>
【2】group_concat_max_len 設(shè)置為最大值:
SET SESSION group_concat_max_len=18446744073709551615;
SELECT GROUP_CONCAT(a.REGION_ID) FROM t_region a;

這樣設(shè)置之后,一般情況下,GROUP_CONCAT 就不會(huì)再出現(xiàn)字符串被截?cái)嗟那闆r啦O(∩_∩)O~