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 值得拥有》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

计算广告

计算广告

刘鹏、王超 / 人民邮电出版社 / 2015-9-1 / 69.00元

计算广告是一项新兴的研究课题,它涉及大规模搜索和文本分析、信息获取、统计模型、机器学习、分类、优化以及微观经济学等诸多领域的知识。本书从实践出发,系统地介绍计算广告的产品、问题、系统和算法,并且从工业界的视角对这一领域具体技术的深入剖析。 本书立足于广告市场的根本问题,从计算广告各个阶段所遇到的市场挑战出发,以广告系统业务形态的需求和变化为主线,依次介绍合约广告系统、竞价广告系统、程序化交易......一起来看看 《计算广告》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具