转载自  MySQL group_concat()函数

MySQL GROUP_CONCAT函数介绍

MySQL GROUP_CONCAT()函数将组中的字符串连接成为具有各种选项的单个字符串。

下面说明了GROUP_CONCAT()函数的语法:

GROUP_CONCAT(DISTINCT expressionORDER BY expressionSEPARATOR sep);

以下是演示GROUP_CONCAT()函数如何工作的一个示例。

USE testdb;
CREATE TABLE t (v CHAR
);INSERT INTO t(v) VALUES('A'),('B'),('C'),('B');SELECT GROUP_CONCAT(DISTINCT vORDER BY v ASCSEPARATOR ';')
FROMt;
-- SELECT v FROM t GROUP BY v;

执行上面查询语句,得到以下结果 -

+---------------------------------------------------------------------+
| GROUP_CONCAT(DISTINCT vORDER BY v ASCSEPARATOR ';') |
+---------------------------------------------------------------------+
| A;B;C                                                               |
+---------------------------------------------------------------------+
1 row in set

注:上面语句类似于把SELECT v FROM t GROUP BY v;语句的结果串接起来。

参考以下图解

DISTINCT子句用于在连接分组之前消除组中的重复值。

ORDER BY子句允许您在连接之前按升序或降序排序值。 默认情况下,它按升序排序值。 如果要按降序对值进行排序,则需要明确指定DESC选项。

SEPARATOR指定在组中的值之间插入的文字值。如果不指定分隔符,则GROUP_CONCAT函数使用逗号()作为默认分隔符。

GROUP_CONCAT函数忽略NULL值,如果找不到匹配的行,或者所有参数都为NULL值,则返回NULL

GROUP_CONCAT函数返回二进制或非二进制字符串,这取决于参数。 默认情况下,返回字符串的最大长度为1024。如果您需要更多的长度,可以通过在SESSIONGLOBAL级别设置group_concat_max_len系统变量来扩展最大长度。

MySQL GROUP_CONCAT示例

让我们来看看示例数据库(yiibaidb)中的customers表,其表结构如下所示 -

mysql> desc customers;
+------------------------+---------------+------+-----+---------+-------+
| Field                  | Type          | Null | Key | Default | Extra |
+------------------------+---------------+------+-----+---------+-------+
| customerNumber         | int(11)       | NO   | PRI | NULL    |       |
| customerName           | varchar(50)   | NO   |     | NULL    |       |
| contactLastName        | varchar(50)   | NO   |     | NULL    |       |
| contactFirstName       | varchar(50)   | NO   |     | NULL    |       |
| phone                  | varchar(50)   | NO   |     | NULL    |       |
| addressLine1           | varchar(50)   | NO   |     | NULL    |       |
| addressLine2           | varchar(50)   | YES  |     | NULL    |       |
| city                   | varchar(50)   | NO   |     | NULL    |       |
| state                  | varchar(50)   | YES  |     | NULL    |       |
| postalCode             | varchar(15)   | YES  |     | NULL    |       |
| country                | varchar(50)   | NO   |     | NULL    |       |
| salesRepEmployeeNumber | int(11)       | YES  | MUL | NULL    |       |
| creditLimit            | decimal(10,2) | YES  |     | NULL    |       |
+------------------------+---------------+------+-----+---------+-------+
13 rows in set

要获取客户所在的国家/地区,以逗号分隔的字符串,您可以使用GROUP_CONCAT函数,如下所示:

SELECT GROUP_CONCAT(country)
FROMcustomers;

SQL

执行上面查询语句,得到以下结果 -

然而,一些客户位于同一个国家。要删除重复的国家/地区名称,请将DISTINCT子句添加到函数,如下查询:

mysql> SELECT GROUP_CONCAT(DISTINCT country)
FROMcustomers;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GROUP_CONCAT(DISTINCT country)                                                                                                                                                                                                |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| France,USA,Australia,Norway,Poland,Germany,Spain,Sweden,Denmark,Singapore,Portugal,Japan,Finland,UK,Ireland,Canada,Hong Kong,Italy,Switzerland,Netherlands,Belgium,New Zealand,South Africa,Austria,Philippines,Russia,Israel |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set

如果国家的名称按升序排列,则可读性更高。要在连接之前排序国家的名称,请使用ORDER BY子句如下:

SELECT GROUP_CONCAT(DISTINCT countryORDER BY country)
FROMcustomers;

执行上面查询语句,得到以下结果 -

mysql> SELECT GROUP_CONCAT(DISTINCT countryORDER BY country)
FROMcustomers;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GROUP_CONCAT(DISTINCT countryORDER BY country)                                                                                                                                                                        |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Australia,Austria,Belgium,Canada,Denmark,Finland,France,Germany,Hong Kong,Ireland,Israel,Italy,Japan,Netherlands,New Zealand,Norway,Philippines,Poland,Portugal,Russia,Singapore,South Africa,Spain,Sweden,Switzerland,UK,USA |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set

要将返回的字符串的默认分隔符从逗号()更改为分号(;),请使用SEPARATOR子句作为以下查询:

SELECT GROUP_CONCAT(DISTINCT countryORDER BY countrySEPARATOR ';')
FROMcustomers;

执行上面查询语句,得到以下结果

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GROUP_CONCAT(DISTINCT countryORDER BY countrySEPARATOR ';')                                                                                                                                                   |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Australia;Austria;Belgium;Canada;Denmark;Finland;France;Germany;Hong Kong;Ireland;Israel;Italy;Japan;Netherlands;New Zealand;Norway;Philippines;Poland;Portugal;Russia;Singapore;South Africa;Spain;Sweden;Switzerland;UK;USA |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set

经过上面几个简单示例,现在您应该知道GROUP_CONCAT函数是如何工作,现在把它应用在一个实际的例子中。

每个客户都有一个或多个销售代表。 换句话说,每个销售人员都负责一个或多个客户。 要了解谁负责哪些客户,使用inner join子句如下:

SELECT employeeNumber, firstname, lastname, customername
FROMemployeesINNER JOINcustomers ON customers.salesRepEmployeeNumber = employees.employeeNumber
ORDER BY firstname , lastname;

执行上面查询语句,得到以下结果 -

+----------------+-----------+-----------+------------------------------------+
| employeeNumber | firstname | lastname  | customername                       |
+----------------+-----------+-----------+------------------------------------+
|           1611 | Andy      | Fixter    | Souveniers And Things Co.          |
|           1611 | Andy      | Fixter    | Australian Collectables, Ltd       |
|           1611 | Andy      | Fixter    | Australian Gift Network, Co        |
|           1611 | Andy      | Fixter    | Australian Collectors, Co.         |
|           1611 | Andy      | Fixter    | Anna's Decorations, Ltd            |
|           1504 | Barry     | Jones     | Baane Mini Imports                 |
|           1504 | Barry     | Jones     | Toms Spezialitten, Ltd             |
************* 此处省略了一大波数据 *********************************************
|           1216 | Steve     | Patterson | Auto-Moto Classics Inc.            |
|           1216 | Steve     | Patterson | Gifts4AllAges.com                  |
|           1216 | Steve     | Patterson | FunGiftIdeas.com                   |
|           1216 | Steve     | Patterson | Diecast Classics Inc.              |
|           1216 | Steve     | Patterson | Online Diecast Creations Co.       |
+----------------+-----------+-----------+------------------------------------+
122 rows in set

现在,我们可以按员工编号对结果集进行分组,并使用GROUP_CONCAT函数连接正在负责员工的所有员工,如下所示:

SELECT employeeNumber,firstName,lastName,GROUP_CONCAT(DISTINCT customernameORDER BY customerName)
FROMemployeesINNER JOINcustomers ON customers.salesRepEmployeeNumber = employeeNumber
GROUP BY employeeNumber
ORDER BY firstName , lastname;

上面查询语句,执行结果如下 -

如下所示的结果更容易阅读。

具有CONCAT_WS函数的MySQL GROUP_CONCAT函数的示例

有时,GROUP_CONCAT函数可以与CONCAT_WS函数相结合,使查询结果更有用。

例如,制作客户分号分隔值列表:

  • 首先,使用CONCAT_WS函数连接每个客户联系人的姓氏和名字,结果是联系人的全名。
  • 然后,使用GROUP_CONCAT函数来创建列表。

以下查询使客户的分号分隔值列表。

SELECT GROUP_CONCAT(CONCAT_WS(', ', contactLastName, contactFirstName)SEPARATOR ';')
FROMcustomers;

请注意,GROUP_CONCAT函数将字符串值连接在不同的行中,而CONCAT_WS或CONCAT函数将不同列中的两个或多个字符串值连接起来。

MySQL GROUP_CONCAT函数:常见错误

GROUP_CONCAT函数返回单个字符串,而不是值列表。 这意味着您不能在IN操作符中使用GROUP_CONCAT函数的结果,例如在子查询中使用。

例如,GROUP_CONCAT函数返回值的结果:123连接成为字符串:1,2,3 。

如果将此结果提供给IN运算符,则查询不能正常工作。因此,查询可能不返回任何结果。例如,以下查询将无法正常工作。

因为IN运算符接受诸如(1,2,3)的值的列表,而不是由值列表('1,2,3')组成的字符串。 因此,以下查询将无法正常工作。

SELECT id, name
FROMtable_name
WHEREid IN GROUP_CONCAT(id);

因为GROUP_CONCAT函数是一个聚合函数,要对值进行排序,必须在函数内使用ORDER BY子句,而不是SELECT语句中的ORDER BY

以下示例演示了在使用GROUP_CONCAT函数的上下文中ORDER BY子句的不正确使用:

SELECT GROUP_CONCAT(DISTINCT countrySEPARATOR ';')
FROMcustomers
ORDER BY country;

SELECT子句返回一个字符串值,因此ORDER BY子句在此语句中不起作用。

MySQL GROUP_CONCAT应用程序

在许多情况下,您可以应用GROUP_CONCAT函数来产生有用的结果。 以下列表是使用GROUP_CONCAT函数的一些常见示例。

  • 用逗号分隔的用户角色,如“管理员,作者,编辑人员”。
  • 生成逗号分隔的用户的爱好,如“设计,编程,阅读”。
  • 为博客帖子,文章或产品创建标签,例如“mysql,mysql聚合函数,mysql教程”。

在本教程中,我们介绍了MySQL GROUP_CONCAT函数,将非空值从一组字符串连接到具有各种选项的字符串中。

参考

MySQL GROUP_CONCAT函数 :
http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat

MySQL group_concat()函数相关推荐

  1. mysql group concat 去重,MySQL group_concat() 函数用法

    MySQL group_concat() 函数用法 在使用 group by对数据进行分组后,如果需要对 select 的数据项进行字符串拼接,这时就需要用到group_concat()函数. 1.基 ...

  2. MySQL group_concat函数使用详解

    「作者主页」:士别三日wyx 「作者简介」:CSDN top100.阿里云博客专家.华为云享专家.网络安全领域优质创作者 「专栏简介」:此文章已录入专栏<MySQL数据库快速入门> gro ...

  3. MySQL GROUP_CONCAT()函数的排序方法

    1. 用法 GROUP_CONCAT() 函数的参数是可以直接使用 ORDER BY 排序的. 2. 例子 1.  表中数据如下: id  username  score 1    张三        ...

  4. [Mysql] GROUP_CONCAT函数

    GROUP_CONCAT函数用于将GROUP BY产生的同一个分组中的值连接起来,返回一个字符串结果 GROUP_CONCAT函数首先根据GROUP BY指定的列进行分组,将同一组的列显示出来,并且用 ...

  5. MYSQL group_concat函数作用

    现在加入有以下数据 id name 1 小猫 2 木头 1 小狗 1 小兔 此时如果进行和合并 就可使用 group_concat 函数 达到效果为: id name 1 小猫,小狗,小兔 2 木头 ...

  6. mysql中group concat_mysql中group_concat()函数的使用方法总结

    本文实例讲述了mysql group_concat()函数用法.分享给大家供大家参考,具体如下: group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果.比 ...

  7. mysql group_concat去重_MySQL group_concat() 函数用法

    MySQL group_concat() 函数用法 在使用 group by对数据进行分组后,如果需要对 select 的数据项进行字符串拼接,这时就需要用到group_concat()函数. 1.基 ...

  8. mysql group_concat去重_mysql GROUP_CONCAT 函数 将相同的键的多个单元格合并到一个单元格...

    mysql GROUP_CONCAT 函数 将相同的键的多个单元格合并到一个单元格 MemberID MemberName FruitName -------------- ------------- ...

  9. mysql group concat_mysql group_concat()函数用法总结

    本文实例讲述了mysql group_concat()函数用法.分享给大家供大家参考,具体如下: group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果.比 ...

最新文章

  1. 小米快传文件服务器怎么用,手机中的小米快传怎么用?小米快传的详细使用教程...
  2. 中文条件jsp mysql_jsp MySQL中的一些中文问题的解决
  3. 创作一个数字人,总共分几步?(下)
  4. Python 数据分析三剑客之 Matplotlib(八):等高线 / 等值线图的绘制
  5. java 数据库连接不上_JAVA基础(六) 处理连接不上MYSQL数据库的方法
  6. 最近找到了一个免费的python教程,两周学会了python开发
  7. 2016-2017 ACM Central Region of Russia Quarterfinal Programming Contest
  8. Android源代码编译——编译
  9. linux企业版as,Redhat 企业版 LINUX AS5.0 下载地址
  10. 互联网广告算法和系统实践-读书笔记
  11. 100本名著浓缩而成的100句话
  12. Win10如何彻底关闭Hyper-V(真实可用,本人亲测)
  13. python计算三个点构成的三角形的外切圆圆心坐标及半径
  14. 多旋翼油门量与升力关系
  15. html的五角星怎么打出来,五角星符号怎么打出来?
  16. 震动硅谷!43 岁知名技术大佬当街遇刺身亡,马斯克怒批暴力犯罪
  17. c语言中 #include < > 和include “ “的区别
  18. 功能:CO11和CO11N的差异
  19. springBoot项目--平台控制商品订单中各商家打印机打印小票--终极版
  20. 今日头条付费专栏的暴利赚钱模式,半年净赚40万!

热门文章

  1. leetcode206. 反转链表
  2. 7-3 最小生成树-kruskal (10 分)(思路+详解+并查集详解+段错误超时解决)宝 Come
  3. [SpringSecurity]web权限方案_用户认证_自定义用户登录页面
  4. [Java基础]接口组成(默认方法,静态方法,私有方法)
  5. 高等数学上-赵立军-北京大学出版社-题解-练习2.5
  6. 最短路(遍历边)计蒜客—DD坐地铁
  7. 汉诺塔 X HDU - 2511
  8. 英语期末复习unit 1-2课后习题第一题及背诵段落
  9. linux 进程内存开销,linux下查看最消耗CPU、内存的进程
  10. 多队列 部分队列没有包_记一次TCP全队列溢出问题排查过程