MySQL group_concat()函数

转载自  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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL标准偏差

转载自 MySQL标准偏差 标准差介绍 标准差是衡量数据集中值的分布情况,标准偏差显示平均值(平均值)存在多少变化。 低标准偏差表明数据集中的值接近于平均值。 而高标准偏差表示数据集的值在大范围的值上分散。 标准偏差是方差的平方根,可以通过以下…

从Visual Studio看微软20年技术变迁

前言 这个世界从来都不缺变革,从工业革命到晶体管和集成电路,从生活电器到物联网,从简陋人机到精致体验,我们在享受技术带来的便捷的同时,也在为复杂设计而带来的挑战和生产力下降而痛并快乐着。而迫切期盼的&#xff…

c传给php数据解包,小程序源码提取工具,完美解包,一键提取小程序源代码工具_PHP源码...

请注意:该源码来源网友分享,搜库资源网不提供技术支持,没有技术能力的小白勿拍。(如需安装服务费用另算)直接解压后就可以使用将小程序文件放到 wxapkg目录下然后打开 CrackMinApp.exe 按说明即可使用那么如何才能在手机里找到小程序的源文件…

2015蓝桥杯省赛---java---C---3(无穷分数)

题目描述 思路分析 它的结果会随着运算的次数越多,会越来越精确一个值,我们只需要把那个大约值求出来即可. 代码实现 package com.atguigu.lanqiao;public class Main {public static void main(String[] args) {System.out.printf("%.5f",f(1));}public static d…

致给博客粉丝

最近一段时间是我最忙的一段时间,也是博客粉丝找我最多的一段时间,好多粉丝找我要人脸识别的jar包和js文件,在这里我给大家统一说一下,粉丝们可以直接关注微信公众号:青鸟IT汇,回复:java人脸识别…

.Net Core迁移到MSBuild平台

一、前言 在上一篇文章.Net Core迁移到MSBuild的多平台编译问题中,简单的讲了下新的项目配置文件中的节点配置,这篇我将用一些例子来详细讲下从project.json迁移到msbuild过程的节点配置。做过完整迁移新项目配置文件的朋友,肯定会觉得新的项…

青鸟IT汇微信公众号新增智能机器人

这么神奇的吗?居然可以智能小机器人无休止的聊天? 各位粉丝大家好,青鸟IT汇于2018年5月7日新加智能小机器人,粉丝们可以进行互动啦~~ 比如说: 或者这个样子的: 还有这个样子的: 偶尔的调戏…

2015蓝桥杯省赛---java---C---2(立方尾不变)

题目描述 代码实现 package com.atguigu.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {int sum0;for (int i 1; i < 10000; i) {String ai"";String b(long)(Math.pow(i,3))"";String cb.substring…

java人脸识别更新:摄像头支持360、火狐和谷歌浏览器

本次更新内容&#xff1a;打开摄像头在原有的火狐基础上新加360浏览器个谷歌浏览器&#xff0c;IE暂且不支持在index.js中&#xff0c;将这段代码&#xff1a;// 支持浏览器 谷歌,火狐,360,欧朋//navigator.getUserMedia这个写法在Opera中好像是navigator.getUserMedianowif …

使用 Angular

N。正如上个月提到的&#xff0c;现在可以开始处理 MEAN 堆栈的前端。也就是说&#xff0c;我们将深入探究 Angular。自本文撰写之时起&#xff08;可能在今后的几年间&#xff09;&#xff0c;我们都会面临一个问题&#xff0c;即 Angular 存在某种版本问题。 Angular 多年来一…

php公告滚动源码,10行js代码实现上下滚动公告效果方法

本文主要给大家介绍了关于利用10行js代码实现滚动公告效果的相关资料&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起看看吧。希望能帮助到大家。需求在最近的项目中需要实现公…

MySQL left()函数

转载自 MySQL left()函数 MySQL LEFT函数介绍 LEFT()函数是一个字符串函数&#xff0c;它返回具有指定长度的字符串的左边部分。 下面是LEFT()函数的语法 - LEFT(str,length);LEFT()函数接受两个参数&#xff1a; str是要提取子字符串的字符串。length是一个正整数&…

2020蓝桥杯省赛---java---B---10(整数小拼接)

题目描述 代码实现 package com.atguigu.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int k sc.nextInt();int[] array new int[n];for (int i 0; i < n; i…

[ASP.NET Core] Middleware

前言 本篇文章介绍ASP.NET Core里&#xff0c;用来处理HTTP封包的Middleware&#xff0c;为自己留个纪录也希望能帮助到有需要的开发人员。 ASP.NET Core官网 结构 在ASP.NET Core里&#xff0c;每个从「浏览器传入」的HTTP Request封包&#xff0c;会被系统封装为「HttpReques…

2015蓝桥杯省赛---java---C---6(奇妙的数字)

题目描述 思路分析 看到这题目想到的就是 for 循环遍历数字&#xff0c;然后计算它的平方和立方再去判断它们刚好使用0-9这10个数各一次。 代码实现 package com.kuang.study.lanqiao;/*** 创建人 wdl* 创建时间 2021/4/8* 描述*/ public class Main {public static void ma…

MySQL substring()函数

转载自 MySQL substring()函数 在本教程中&#xff0c;我们将向您介绍MySQL SUBSTRING函数从字符串中提取子字符串。 SUBSTRING函数从特定位置开始的字符串返回一个给定长度的子字符串。 MySQL提供了各种形式的子串功能。 我们将在以下部分中检查SUBSTRING函数的每种形式。…

跨平台的.NET邮件协议MailKit组件解析

发起的.NET Core开源组织号召&#xff0c;进展的速度是我自己也没有想到的&#xff0c;很多园友都积极参与&#xff08;虽然有些人诚心砸场子&#xff0c;要是以我以前的宝脾气&#xff0c;这会应该被我打住院了吧&#xff0c;不过幸好是少数&#xff0c;做一件事总有人说好&am…

2015蓝桥杯省赛---java---C---9(打印大X)

题目描述 思路分析 找规律 代码实现 package com.kuang.study.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int x sc.nextInt();int y sc.nextInt();char [][] arr new char[y][y…

老司机实战Windows Server Docker:1 初体验之各种填坑

前言 Windows Server 2016正式版发布已经有近半年时间了&#xff0c;除了看到携程的同学分享了一些Windows Server Docker的实践经验&#xff0c;网上比较深入的资料&#xff0c;不管是中文或英文的&#xff0c;都还不太多。工作中对Windows Server 2016下的Docker&#xff0c…

.NET Core项目从xproj+project.json向csproj迁移简介

3月7日&#xff0c;微软发布了Visual Studio 2017 RTM&#xff0c;与之一起发布的还有.NET Core Runtime 1.1.0以及.NET Core SDK 1.0.0&#xff0c;尽管这些并不是最新版&#xff0c;但也已经从preview版本升级到了正式版。所以&#xff0c;在安装Visual Studio 2017时如果启用…