关注我

    我的微信
在线咨询 x
在线咨询
有什么可以帮到你
点击咨询

MySQL 中 GROUP_CONCAT() 的使用

简介GROUP_CONCAT([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']), 使用 GROUP_CONCAT()函数必须对源数据进行分组,否则所有数据会被合并成一行

1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

2、语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc  ] [separator '分隔符'] )

说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。

注意:使用 GROUP_CONCAT()函数必须对源数据进行GROUP分组,否则所有数据会被合并成一行。


首先,建立一张表

DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '',
`course_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT ''
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

给这张表插入一些数据

INSERT INTO `course` VALUES ('张三', 'PHP');
INSERT INTO `course` VALUES ('张三', 'MySQL');
INSERT INTO `course` VALUES ('张三', 'JavaScript');
INSERT INTO `course` VALUES ('李四', 'HTML');
INSERT INTO `course` VALUES ('李四', 'CSS');
INSERT INTO `course` VALUES ('王五', 'Linux');
INSERT INTO `course` VALUES ('王五', 'Redis');



简单的查询

select t.name as '姓名',t.course_name  as '课程' from course t;


MySQL  中 GROUP_CONCAT() 的使用.png



但是这样同一个名字出现多次,看上去非常不直观。有没有更直观的方法,既让每个名字都只出现一次,又能够显示所有的名字相同人的数据呢?——使用GROUP_CONCAT()。


需求: 将每个人的课程合并为一行数据

select t.name as '姓名',GROUP_CONCAT(t.course_name)  as '课程' from course t  group by t.name;


MySQL  中 GROUP_CONCAT() 的使用.png


修改分隔符,用 #号 代替 逗号

select t.name as '姓名',GROUP_CONCAT(t.course_name  order by t.course_name SEPARATOR '#')  as '课程' from course t  group by t.name;


MySQL  中 GROUP_CONCAT() 的使用.png