在MYSQL中的一个列中有多个值
在MYSQL中的一个列中有多个值
我现在有三个数据库。这是生成每个表的SQL代码。
创建课程表:
CREATE TABLE `Course` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(25) NOT NULL,
`startTime` time NOT NULL,
PRIMARY KEY (`id`)
);
创建学校表:
CREATE TABLE `School` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`schoolname` varchar(25) NOT NULL,
PRIMARY KEY (`id`)
);
创建学校课程表:
CREATE TABLE `SchoolCourse` (
`schoolid` int(11) NOT NULL,
`courseid` int(11) NOT NULL,
PRIMARY KEY (`schoolid`,`courseid`),
KEY `FK_course` (`courseid`),
CONSTRAINT `FK_course` FOREIGN KEY (`courseid`) REFERENCES `Course` (`id`),
CONSTRAINT `FK_Student` FOREIGN KEY (`schoolid`) REFERENCES `School` (`id`)
);
我的目标是使它看起来像这样:
---------------------------------------------------
|学校名称 | 课程 |
---------------------------------------------------
| 学校1 | 课程1,课程2,课程3 |
| 学校2 | 课程1,课程3 |
| 学校3 | 课程3 |
| 学校4 | 课程1,课程2,课程3,课程4 |
---------------------------------------------------
我似乎无法弄清楚如何做到这一点。我尝试输入以下值:
INSERT INTO 'ShcoolCourse' VALUES (
(1, 1), (1, 2), (1, 3),
(2, 1), (2, 3),
(3, 3),
(4, 1), (4, 2), (4, 3), (4, 4));
然后,我会执行连接操作,并尝试将值放入一个列中,但迄今为止没有成功,
我查看了其他问题,有些问题有相同的想法,但并不完全符合我的要求。非常感谢您的帮助。
在MYSQL中,出现"Multiple values in one column"(一个列中有多个值)的问题是因为数据表的设计不符合规范,存在冗余数据。解决这个问题的方法是使用GROUP_CONCAT函数来生成逗号分隔的输出。
当前的数据表结构是规范的,如果你想要得到逗号分隔的输出,只需要在查询时使用GROUP_CONCAT函数即可:
SELECT
t1.id,
t1.schoolname AS `School Name`,
GROUP_CONCAT(t3.name) AS Courses
FROM School t1
LEFT JOIN SchoolCourse t2
ON t1.id = t2.schoolid
LEFT JOIN Course t3
ON t2.courseid = t3.id
GROUP BY
t1.id,
t1.schoolname
需要注意的是,我在聚合函数中同时包含了id和schoolname,因为不同的学校可能会有相同的名称,我们需要一种方式来区分它们。
只是出于好奇,我想确认一下这种存储数据的方式是否正确?看起来用户可能只是存储和检索数据,但是将来这会使事情变得复杂,因为数据表没有进行规范化。
我的答案与数据存储无关。你的表结构看起来很好,是规范的,应该这样做。不要存储CSV数据,只需在查询时构建所需的结果即可。
多个值在一个列中的问题通常是由于数据库查询中的多表连接导致的。在上述示例中,我们可以看到查询涉及到三个表:school、schoolcourse和cource。通过使用GROUP BY和group_concat函数,我们可以将多个值合并到一个列中。
在这个例子中,我们首先通过使用LEFT JOIN将school和schoolcourse表连接起来,然后再通过LEFT JOIN将schoolcourse和cource表连接起来。这样,我们就可以将每个学校的名称(schoolname)与其对应的课程名称(name)合并在一起。
通过使用GROUP BY子句,我们可以按照学校的id将结果进行分组。在每个分组中,使用group_concat函数将每个学校对应的课程名称合并为一个字符串。
最后,我们可以得到一个包含学校名称和对应课程的结果集。
如果我们想要在一个列中显示多个值,而不是将它们合并为一个字符串,我们可以使用其他方法,如使用子查询或使用连接表来实现。
总结起来,将多个值合并到一个列中的问题可以通过使用GROUP BY和group_concat函数来解决。