zoukankan      html  css  js  c++  java
  • 分组拼接字符串,GROUP_CONCAT

    背景

    一年过的很快,文中后来的两位员工 馮大 和 馮二 也要面对无情的 KPI 考核了,他们工作干的很不错,performance 分别是 4 和 5

    file

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

    file

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

    GROUP_CONCAT(expr)

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

    file

    定义

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

    接下来领导又提新需求了

    file

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

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

    来看结果:
    file

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

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

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

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

    file

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

    show variables like 'group_concat_max_len';
    

    file

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

    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, name
    FROM
        table_name
    WHERE
        id IN GROUP_CONCAT(id);
    

    灵魂追问

    聚合函数和 group by 搭配有哪些限制?
    你能马上想到的聚合函数操作除了 sum 还有哪些?

    转自:https://segmentfault.com/a/1190000021680731

  • 相关阅读:
    移动端的爬坑路
    判断设备ios或android以及判断是否是微信内置浏览器
    使用vue directive 写好的滑动删除功能
    不用ajax,使用json数据渲染商品的方法
    vue中使用swiper的一些坑
    vue的自定义指令的坑
    better-score获取滑动距离的坑
    linux命令
    关于打印
    数据可视化
  • 原文地址:https://www.cnblogs.com/chen-chen-chen/p/12310855.html
Copyright © 2011-2022 走看看