可以使用 SUBSTRING_INDEX 函数将 group_concat 的结果拆分成多行。例如,假设有以下表:
CREATE TABLE `students` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`subjects` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
现在需要根据 subjects 字段对学生进行分组,并将每个学生的课程拆分成多行。可以使用以下 SQL 语句实现:
SELECT name,
SUBSTRING_INDEX(SUBSTRING_INDEX(subjects, ',', n), ',', -1) as subject
FROM students
JOIN (SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3) nums
ON CHAR_LENGTH(subjects)-CHAR_LENGTH(REPLACE(subjects,',',''))>=n-1;
该语句将学生的课程通过逗号分隔符拆分为多个字符串,并将其作为子查询中的 num 表进行连接。然后使用 SUBSTRING_INDEX 函数按照逗号分隔符将字符串进一步拆分,生成多行记录。
例如,如果数据如下所示:
INSERT INTO students(name, subjects) VALUES('张三', '数学,英语,物理');
INSERT INTO students(name, subjects) VALUES('李四', '语文,化学');
INSERT INTO students(name, subjects) VALUES('王五', '生物');
则执行以上 SQL 后,会得到以下结果:
+--------+---------+
| name | subject |
+--------+---------+
| 张三 | 数学 |
| 张三 | 英语 |
| 张三 | 物理 |
| 李四 | 语文 |
| 李四 | 化学 |
| 王五 | 生物 |
+--------+---------+




