MySQL拼接字符串,GROUP_CONCAT 值得拥有

栏目: IT技术 · 发布时间: 4年前

内容简介:上一篇文章新需求来了,静悄悄的来了!!! 领导想要查看每个 performance 下都有谁,同时要求将这些人的名称要逗号拼接成一个字符串,也就是说要得到下面的结果:

上一篇文章 跨表更新,看到自己写的 SQL 像个憨憨 写了关于跨表个更新的内容。一年过的很快,文中后来的两位员工 馮大馮二 也要面对无情的 KPI 考核了,他们工作干的很不错,performance 分别是 4 和 5

MySQL拼接字符串,GROUP_CONCAT 值得拥有

新需求来了,静悄悄的来了!!! 领导想要查看每个 performance 下都有谁,同时要求将这些人的名称要逗号拼接成一个字符串,也就是说要得到下面的结果:

MySQL拼接字符串,GROUP_CONCAT 值得拥有

要将结果集中某个指定的列进行字符串拼接,这要怎么做呢?主角闪亮:sparkles:登场

GROUP_CONCAT(expr)

Mysql 官方文档 中,该函数被放在聚合函数章节,如果你要按照指定字段分组拼接,就要配合关键字 GROUP BY 来使用的

MySQL拼接字符串,GROUP_CONCAT 值得拥有

定义

该函数返回一个字符串结果,该字符串结果是通过分组串联的 非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是这个结果:

MySQL拼接字符串,GROUP_CONCAT 值得拥有

到这里,领导给过来的需求就完成了:stuck_out_tongue_winking_eye:

客官请留步,您点的菜还没上完呢......

我们是国际化的团队,我们的家乡遍布五湖四海

MySQL拼接字符串,GROUP_CONCAT 值得拥有

领导想关怀一下员工,要查看公司全部员工的家乡都有哪些地方。员工们可能来自同一个地方,所以要将结果集去重复, DISTINCT 关键字就派上用场了

SELECT GROUP_CONCAT(DISTINCT home_town)
FROM employees;

来看结果:

MySQL拼接字符串,GROUP_CONCAT 值得拥有

领导的关怀遍布五湖四海啊......

文案要改了,领导的关怀是遍布 四海五湖 的, 那么 ORDER BY 关键字就派上用场了

SELECT GROUP_CONCAT(DISTINCT home_town ORDER BY home_town DESC) AS '领导关怀地区'
FROM employees;

-- 没我这么起变量的哈,还是汉语,我看你是疯了

MySQL拼接字符串,GROUP_CONCAT 值得拥有

这里你看到 GROUP_CONCAT 函数拼接字符串默认的分隔符是逗号 , , 领导不开心,逗号么的感情,要用:grey_exclamation:才能体现出关怀的强烈, SEPARATOR 关键字就派上用场了

分组拼接的值之间默认分隔符是逗号(,)。要明确指定分隔符,需要使用 SEPARATOR 关键字,紧跟其后的是你想设置的分隔符。要完全消除分隔符,就在 SEPARATOR 关键字后面写 '' 就好了

SELECT GROUP_CONCAT(DISTINCT home_town ORDER BY home_town DESC SEPARATOR '!') AS '领导关怀地区'
FROM employees;

MySQL拼接字符串,GROUP_CONCAT 值得拥有

SELECT GROUP_CONCAT(DISTINCT home_town SEPARATOR '') AS '领导关怀地区'
FROM employees;

MySQL拼接字符串,GROUP_CONCAT 值得拥有

这关怀到位了吧,你品,你细品!!!

领导的关怀能力也有限, 拼接的字符串默认的最大长度是1024个字符 ,可以通过下面语句查看当前限制是多少:

show variables like 'group_concat_max_len';

MySQL拼接字符串,GROUP_CONCAT 值得拥有

领导的能力可是飘忽不定的,所以我们可以灵活的设置这个值

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()函数用法 , 很简单,请自行查看吧......

注意:warning:

GROUP_CONCAT()函数返回单个字符串,而不是值列表。这意味着我们不能在 IN 运算符中使用GROUP_CONCAT()函数的结果,例如,在子查询中, 像这样:

SELECT
    id, name
FROM
    table_name
WHERE
    id IN GROUP_CONCAT(id);

总结

在许多情况下,我们都可以应用GROUP_CONCAT()函数产生出有用的结果,同时也可以结合其他函数发挥出更大的威力. 单招学会了,就要学会连招 combo 了

  • 如果你也像我一样刚知道这个知识点,还请点个「在看」
  • 如果你早都知道这个小儿科内容,还请留言送上「嘘声」

灵魂追问

  1. 聚合函数和 group by 搭配有哪些限制?

  2. 你能马上想到的聚合函数操作除了 sum 还有哪些?


以上所述就是小编给大家介绍的《MySQL拼接字符串,GROUP_CONCAT 值得拥有》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Hacking Growth

Hacking Growth

Sean Ellis、Morgan Brown / Crown Business / 2017-4-25 / USD 29.00

The definitive playbook by the pioneers of Growth Hacking, one of the hottest business methodologies in Silicon Valley and beyond. It seems hard to believe today, but there was a time when Airbnb w......一起来看看 《Hacking Growth》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具