MySQL拼接字符串函数GROUP_CONCAT详解

(编辑:jimmy 日期: 2024/12/27 浏览:2)

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

MySQL拼接字符串函数GROUP_CONCAT详解

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

MySQL拼接字符串函数GROUP_CONCAT详解

要将结果集中某个指定的列进行字符串拼接,这要怎么做呢?主角闪亮"" referrerpolicy="no-referrer" alt="" src="/UploadFiles/2021-04-09/202002040917213.png">

定义

该函数返回一个字符串结果,该字符串结果是通过分组串联的非NULL值。如果没有非NULL值,则返回NULL。完整语法如下:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
       [ORDER BY {unsigned_integer | col_name | expr}
         [ASC | DESC] [,col_name ...]]
       [SEPARATOR str_val])

What"htmlcode">

SELECT performance, GROUP_CONCAT(employee_name) AS employees
FROM employees
GROUP BY performance;

zou是这个结果:

MySQL拼接字符串函数GROUP_CONCAT详解

到这里,领导给过来的需求就完成了"" referrerpolicy="no-referrer" alt="" src="/UploadFiles/2021-04-09/202002040917215.png">

领导想关怀一下员工,要查看公司全部员工的家乡都有哪些地方。员工们可能来自同一个地方,所以要将结果集去重复,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 函数拼接字符串默认的分隔符是逗号 ,, 领导不开心,逗号么的感情,要用"htmlcode">

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

注意"htmlcode">

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

总结

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