01 group_concat函数的使用 一对多场景,将多条记录合并成一条记录展示
0X 01 背景
有一张学生表,表结构如下所示
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;
数据内容如下所示
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 ]
)
- 通过
distinct
可以排除重复值 - 如果希望对结果中的值进行排序,可以使用
order by
字句 separator
指定分组元素的连接符,默认是,
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
知行合一