01 group_concat函数的使用 一对多场景,将多条记录合并成一条记录展示

0X 01 背景

有一张学生表,表结构如下所示
image.png

CREATE TABLE `student`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `stu_id` int(11) NOT NULL,
  `stu_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '学生姓名',
  `cls_id` int(11) NULL DEFAULT NULL COMMENT '班级ID',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

数据内容如下所示
image.png

INSERT INTO `student`(`id`, `stu_id`, `stu_name`, `cls_id`) VALUES (1, 1001, '赵云', 1);
INSERT INTO `student`(`id`, `stu_id`, `stu_name`, `cls_id`) VALUES (2, 1002, '张飞', 1);
INSERT INTO `student`(`id`, `stu_id`, `stu_name`, `cls_id`) VALUES (3, 1003, '关羽', 1);
INSERT INTO `student`(`id`, `stu_id`, `stu_name`, `cls_id`) VALUES (4, 2001, '司马懿', 2);
INSERT INTO `student`(`id`, `stu_id`, `stu_name`, `cls_id`) VALUES (5, 2002, '夏侯惇', 2);

0X 02 目标

查看展示每个班(cls_id)的人,效果如下:赵云、张飞、关羽司马懿、夏侯惇

0X 03 操作

使用group_concat()函数,返回一个字符串结果,该结果由分组中的值连接组合而成。

GROUP_CONCAT(
   [ DISTINCT ] expr [,
   expr...] [ 
   ORDER BY { unsigned_integer | col_name | formula } [ ASC | DESC ] [,
   col...] ] [ SEPARATOR str_val ]
 )
  1. 通过distinct可以排除重复值
  2. 如果希望对结果中的值进行排序,可以使用order by字句
  3. separator 指定分组元素的连接符,默认是,
  4. group_concat_max_len 设置一个最大的长度
SELECT
	cls_id,
	group_concat( stu_name ORDER BY stu_name SEPARATOR '、' ) AS members_ordered,
	group_concat( stu_name SEPARATOR '-' ) AS members 
FROM
	student 
GROUP BY
	cls_id

image.png

posted @ 2020-11-28 13:47  在线打工者  阅读(224)  评论(0编辑  收藏  举报