上一篇文章 跨表更新,看到自己写的SQL像个憨憨 写了关于跨表个更新的内容。一年过的很快,文中后来的两位员工 馮大 和 馮二 也要面对无情的 KPI 考核了,他们工作干的很不错,performance 分别是 4 和 5
![02dd1b9da133c67575ccf7e0ebb6ecf8.png](https://i-blog.csdnimg.cn/blog_migrate/d100fbe3a8d019da8260f96b10821453.jpeg)
新需求来了,静悄悄的来了!!! 领导想要查看每个 performance 下都有谁,同时要求将这些人的名称要逗号拼接成一个字符串,也就是说要得到下面的结果:
![5c392c62524bec998cbb3e03eeb19957.png](https://i-blog.csdnimg.cn/blog_migrate/8f5dba7fe6664191930161cf9521d954.jpeg)
要将结果集中某个指定的列进行字符串拼接,这要怎么做呢?主角闪亮✨登场
GROUP_CONCAT(expr)
在 Mysql 官方文档 中,该函数被放在聚合函数章节,如果你要按照指定字段分组拼接,就要配合关键字 GROUP BY 来使用的
![b788cccf2dad1536e3b096cda4d9e8cf.png](https://i-blog.csdnimg.cn/blog_migrate/c90b5868ca6c88058d24de67a80979a2.jpeg)
定义
该函数返回一个字符串结果,该字符串结果是通过分组串联的非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 employeesFROM employeesGROUP BY performance;
zou是这个结果:
![907bc8a2360c1ec61bdca574451f8464.png](https://i-blog.csdnimg.cn/blog_migrate/b8d0edd53ec48f5088a79716f1e9f978.jpeg)
到这里,领导给过来的需求就完成了
客官请留步,您点的菜还没上完呢......
我们是国际化的团队,我们的家乡遍布五湖四海
![41f822262a1666eb4e6baf57f7c1d592.png](https://i-blog.csdnimg.cn/blog_migrate/5fa6179c2ab094f4564c09eea90549ef.jpeg)
领导想关怀一下员工,要查看公司全部员工的家乡都有哪些地方。员工们可能来自同一个地方,所以要将结果集去重复,DISTINCT 关键字就派上用场了
SELECT GROUP_CONCAT(DISTINCT home_town)FROM employees;
来看结果:
![d3a633f56aedc10a52136d4821954e1c.png](https://i-blog.csdnimg.cn/blog_migrate/def7f8054c956d36189e2ab155dfc68b.jpeg)
领导的关怀遍布五湖四海啊......
文案要改了,领导的关怀是遍布四海五湖的, 那么 ORDER BY 关键字就派上用场了
SELECT GROUP_CONCAT(DISTINCT home_town ORDER BY home_town DESC) AS '领导关怀地区'FROM employees;-- 没我这么起变量的哈,还是汉语,我看你是疯了
![9abf527088bff038e5decfae4dd6b844.png](https://i-blog.csdnimg.cn/blog_migrate/8912d37b6a21456032c770ccd5c3a04c.jpeg)
这里你看到 GROUP_CONCAT 函数拼接字符串默认的分隔符是逗号 ,, 领导不开心,逗号么的感情,要用❕才能体现出关怀的强烈, SEPARATOR 关键字就派上用场了
分组拼接的值之间默认分隔符是逗号(,)。要明确指定分隔符,需要使用 SEPARATOR 关键字,紧跟其后的是你想设置的分隔符。要完全消除分隔符,就在 SEPARATOR 关键字后面写 '' 就好了
SELECT GROUP_CONCAT(DISTINCT home_town ORDER BY home_town DESC SEPARATOR '!') AS '领导关怀地区'FROM employees;
![d55a681deb5f46505fe5d00e77449f61.png](https://i-blog.csdnimg.cn/blog_migrate/9c3d276e2e9b99cc6947f855620cd3e2.jpeg)
SELECT GROUP_CONCAT(DISTINCT home_town SEPARATOR '') AS '领导关怀地区'FROM employees;
![571a244a5031dfbde0c934b46ff7ad99.png](https://i-blog.csdnimg.cn/blog_migrate/2f66659da8abeea29868aa5c1f471b90.jpeg)
这关怀到位了吧,你品,你细品!!!
领导的关怀能力也有限,拼接的字符串默认的最大长度是1024个字符,可以通过下面语句查看当前限制是多少:
show variables like 'group_concat_max_len';
![0675ab888cf7e26ead1c6aa63661185a.png](https://i-blog.csdnimg.cn/blog_migrate/6f778119076471a2304dcdd2bef7cc5e.jpeg)
领导的能力可是飘忽不定的,所以我们可以灵活的设置这个值
SET [GLOBAL | SESSION] group_concat_max_len = val;
- SESSION: 在当前对话中生效
- GLOBAL:全局都生效
该语句在执行后,MySQL重启之前一直有作用,一旦重启 MySQL,则会恢复默认值
有时候 GROUP_CONCAT() 还要搭配 CONCAT_WS() 发挥出一点点威力,举个简单的例子
将消费者的名和姓用逗号进行分隔,然后再用 ; 进行分隔
SELECT GROUP_CONCAT( CONCAT_WS(', ', contactLastName, contactFirstName) SEPARATOR ';')FROM customers;
这里是 CONCAT_WS()函数用法, 很简单,请自行查看吧......
注意⚠️
GROUP_CONCAT()函数返回单个字符串,而不是值列表。这意味着我们不能在 IN 运算符中使用GROUP_CONCAT()函数的结果,例如,在子查询中, 像这样:
SELECT id, nameFROM table_nameWHERE id IN GROUP_CONCAT(id);
总结
在许多情况下,我们都可以应用GROUP_CONCAT()函数产生出有用的结果,同时也可以结合其他函数发挥出更大的威力. 单招学会了,就要学会连招 combo 了
作者:日拱一兵
链接:https://juejin.cn/post/6844904056381505550
来源:掘金