MySQL 的 GROUP_CONCAT 函數(shù)詳解

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

GROUP_CONCAT 語(yǔ)法規(guī)則

它在遞歸查詢中用的比較多,但要使用好它并不容易。所以讓我們一起來看看吧:

假設(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;
連接所有非 NULL 的字符串

【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;
加入 DISTINCT 、 ORDER BY 與 SEPARATOR

這里的返回值以過濾了重復(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ǔ)法如下:

修改 group_concat_max_len 參數(shù)

值是無(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;
使用默認(rèn)值的返回結(jié)果

可以看出,當(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;
group_concat_max_len 設(shè)置為最大值的返回結(jié)果

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容