您好,登錄后才能下訂單哦!
上一篇文章 跨表更新,看到自己寫的SQL像個憨憨寫了關(guān)于跨表個更新的內(nèi)容。一年過的很快,文中后來的兩位員工 馮大
和 馮二
也要面對無情的 KPI 考核了,他們工作干的很不錯,performance 分別是 4 和 5
新需求來了,靜悄悄的來了?。?! 領(lǐng)導想要查看每個 performance 下都有誰,同時要求將這些人的名稱要逗號拼接成一個字符串,也就是說要得到下面的結(jié)果:
要將結(jié)果集中某個指定的列進行字符串拼接,這要怎么做呢?主角閃亮✨登場
GROUP_CONCAT(expr)
在 Mysql 官方文檔 中,該函數(shù)被放在聚合函數(shù)章節(jié),如果你要按照指定字段分組拼接,就要配合關(guān)鍵字 GROUP BY
來使用的
定義
該函數(shù)返回一個字符串結(jié)果,該字符串結(jié)果是通過分組串聯(lián)的非NULL值
。如果沒有非NULL值,則返回NULL。完整語法如下:
GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])
What? 這個語法看著太復雜了吧,別著急,下面會用例子慢慢說明逐一驗證滴
使用案例
先完成文章開頭的需求:
SELECT performance, GROUP_CONCAT(employee_name) AS employees FROM employees GROUP BY performance;
zou是這個結(jié)果:
到這里,領(lǐng)導給過來的需求就完成了😜
客官請留步,您點的菜還沒上完呢......
我們是國際化的團隊,我們的家鄉(xiāng)遍布五湖四海
領(lǐng)導想關(guān)懷一下員工,要查看公司全部員工的家鄉(xiāng)都有哪些地方。員工們可能來自同一個地方,所以要將結(jié)果集去重復,DISTINCT
關(guān)鍵字就派上用場了
SELECT GROUP_CONCAT(DISTINCT home_town) FROM employees;
來看結(jié)果:
領(lǐng)導的關(guān)懷遍布五湖四海啊......
文案要改了,領(lǐng)導的關(guān)懷是遍布四海五湖
的, 那么 ORDER BY
關(guān)鍵字就派上用場了
SELECT GROUP_CONCAT(DISTINCT home_town ORDER BY home_town DESC) AS '領(lǐng)導關(guān)懷地區(qū)' FROM employees; -- 沒我這么起變量的哈,還是漢語,我看你是瘋了
這里你看到 GROUP_CONCAT
函數(shù)拼接字符串默認的分隔符是逗號 ,
, 領(lǐng)導不開心,逗號么的感情,要用❕才能體現(xiàn)出關(guān)懷的強烈, SEPARATOR
關(guān)鍵字就派上用場了
分組拼接的值之間默認分隔符是逗號(,)。要明確指定分隔符,需要使用SEPARATOR
關(guān)鍵字,緊跟其后的是你想設(shè)置的分隔符。要完全消除分隔符,就在SEPARATOR
關(guān)鍵字后面寫 '' 就好了
SELECT GROUP_CONCAT(DISTINCT home_town ORDER BY home_town DESC SEPARATOR '!') AS '領(lǐng)導關(guān)懷地區(qū)' FROM employees;
SELECT GROUP_CONCAT(DISTINCT home_town SEPARATOR '') AS '領(lǐng)導關(guān)懷地區(qū)' FROM employees;
這關(guān)懷到位了吧,你品,你細品!??!
領(lǐng)導的關(guān)懷能力也有限,拼接的字符串默認的最大長度是1024個字符,可以通過下面語句查看當前限制是多少:
show variables like 'group_concat_max_len';
領(lǐng)導的能力可是飄忽不定的,所以我們可以靈活的設(shè)置這個值
SET [GLOBAL | SESSION] group_concat_max_len = val;
SESSION: 在當前對話中生效 GLOBAL:全局都生效
該語句在執(zhí)行后,MySQL重啟之前一直有作用,一旦重啟 MySQL,則會恢復默認值
有時候 GROUP_CONCAT()
還要搭配 CONCAT_WS()
發(fā)揮出一點點威力,舉個簡單的例子
將消費者的名和姓用逗號進行分隔,然后再用 ;
進行分隔
SELECT GROUP_CONCAT( CONCAT_WS(', ', contactLastName, contactFirstName) SEPARATOR ';') FROM customers;
這里是 CONCAT_WS()函數(shù)用法, 很簡單,請自行查看吧......
注意⚠️
GROUP_CONCAT()函數(shù)返回單個字符串,而不是值列表。這意味著我們不能在 IN 運算符中使用GROUP_CONCAT()函數(shù)的結(jié)果,例如,在子查詢中, 像這樣:
SELECT id, name FROM table_name WHERE id IN GROUP_CONCAT(id);
總結(jié)
在許多情況下,我們都可以應用GROUP_CONCAT()函數(shù)產(chǎn)生出有用的結(jié)果,同時也可以結(jié)合其他函數(shù)發(fā)揮出更大的威力. 單招學會了,就要學會連招 combo 了
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。