MySQL多行數據合併之GROUP_CONCAT函數
一、GROUP_CONCAT函數語法
- 函數語法:
group_concat( [DISTINCT] 需要連接的字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’] )
二、創建表和添加測試數據
1、建表
- 建表語句:
-- 人員信息表
CREATE TABLE `person` (
`id` int(10) NOT NULL COMMENT '主鍵',
`name` varchar(32) DEFAULT NULL COMMENT '姓名',
`room_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '房間id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- 房間信息表
CREATE TABLE `room` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '房間表主鍵',
`room_name` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '房間名稱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=203 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
2、添加測試數據
- 測試數據:
-- 人員信息測試數據
insert into `person`(`id`,`name`,`room_id`) values
(1,'孟凱','101'),
(2,'聞莉','102'),
(3,'李天斌','101'),
(4,'孫燦','103'),
(5,'宋凱','103'),
(6,'李誼','201'),
(7,'劉敏','202'),
(8,'韓志成','202'),
(9,'年波','101'),
(10,'牛德峯','102');
--房間信息測試數據
insert into `room`(`id`,`room_name`) values
(101,'辦公室101'),
(102,'辦公室102'),
(103,'辦公室103'),
(201,'辦公室201'),
(202,'辦公室202'),
(203,'辦公室203');
三、編寫測試SQL語句
1、人員信息表(左)和房間信息表(右)
2、場景模擬
- 查詢所有房間裏的辦公人員信息(相同辦公室人員信息展示在一列中)
SELECT t2.*,t1.room_id,t1.name FROM person t1 LEFT JOIN room t2 ON t2.id = t1.room_id
- 查詢結果:
很顯然這樣不滿足查詢需求
- 使用GROUP_CONCAT()
SELECT t1.*,GROUP_CONCAT(t2.name) FROM room t1 LEFT JOIN person t2 ON t1.id = t2.room_id GROUP BY t1.`id`
- 查詢結果
這裏可以看到GROUP_CONCAT()函數的作用。
3、修改GROUP_CONCAT() 函數分隔符
- GROUP_CONCAT()函數默認是逗號分隔
- 修改 GROUP_CONCAT(expr SEPARATOR ‘分隔符’)
SELECT t1.*,GROUP_CONCAT(t2.name SEPARATOR ';') FROM room t1 LEFT JOIN person t2 ON t1.id = t2.room_id GROUP BY t1.`id`
- 查詢結果:
4、GROUP_CONCAT() 函數去重
按理說人員重名不該進行去重操作,但是這裏只是進行函數功能測試,不涉及業務問題。
爲了方便測試這裏的人員信息表我新增了一條人員信息:
- SQL:
INSERT INTO `person`(`id`,`name`,`room_id`) VALUES (11,'孟凱','101');
- GROUP_CONCAT(DISTINCT expr SEPARATOR ‘分隔符’)
SELECT t1.*,GROUP_CONCAT(DISTINCT t2.name SEPARATOR ';') FROM room t1 LEFT JOIN person t2 ON t1.id = t2.room_id GROUP BY t1.`id`
- 查詢結果:
5、GROUP_CONCAT() 函數排序
注意:這裏的排序是對字段中的數據進行排序。
- GROUP_CONCAT(DISTINCT expr [Order BY 排序字段 ASC/DESC] SEPARATOR ‘分隔符’)
- 根據人員id倒序展示
SELECT t1.*,GROUP_CONCAT(DISTINCT t2.name ORDER BY t2.id DESC SEPARATOR ';' ) FROM room t1 LEFT JOIN person t2 ON t1.id = t2.room_id GROUP BY t1.`id`
- 查詢結果:
–如果需要轉載,請註明原文出處