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`
  • 查詢結果:
    在這裏插入圖片描述

–如果需要轉載,請註明原文出處

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章