【问题标题】:Multiple values in one column MYSQL一列MYSQL中有多个值
【发布时间】:2017-09-25 03:09:51
【问题描述】:

所以我现在有三个数据库。这是生成每个表的 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`)
);

我对这些表格的目标是让它看起来像这样

---------------------------------------------------
|School Name  |          Courses                  |
---------------------------------------------------
| School1     | Course1, Course2, Course3         |
| School2     | Course1, Course3                  |
| School3     | Course3                           |
| School4     | Couse1, Course2, Course3, Course4 |
---------------------------------------------------

我似乎无法弄清楚如何做到这一点。我试过输入这样的值。

INSERT INTO 'ShcoolCourse' VALUES (
(1, 1), (1, 2), (1, 3),
(2, 1), (2, 3),
(3, 3),
(4, 1), (4, 2), (4, 3), (4, 4)); 

然后我会从那里执行连接并尝试将值放入一列但到目前为止没有运气, 我环顾了其他问题,其中一些有相同的想法,但不完全是我 正在做。任何帮助将不胜感激。

【问题讨论】:

  • 别这样,不符合规范化规则。
  • @nobalG 那么有什么好的解决方法呢?如果我不这样做呢?
  • @nobalG 它已经足够规范化了,这里真正的问题是关于如何获得所需的结果(SchoolCourseSchool 分组)
  • @nobalG 在这个设计中,一列中存储的值不超过一个。

标签: mysql sql


【解决方案1】:

您当前的架构已标准化并且非常好。如果您想要这样的逗号分隔输出,那么只需在您使用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

请注意,我将idschoolname 都包含在聚合中,因为有可能两个不同的学校碰巧同名,我们需要一些方法来区分它们。

【讨论】:

  • 只是出于好奇,我想确认一下这是存储数据的正确方式吗?看起来用户可能只是存储和检索数据,但将来这会使事情变得复杂,因为表没有标准化。
  • 我的回答与存储数据无关。您的表设置看起来不错,已标准化,并且是可行的方法。不要存储 CSV 数据,只需在查询时构建您需要的数据。
【解决方案2】:

您可以将GROUP BYgroup_concat 一起使用:

select
    s.schoolname `School Name`,
    group_concat(c.name) Courses
from school s
left join schoolcourse sc on s.id = sc.schoolid
left join cource c on c.id = sc.courseid
group by s.id

【讨论】:

  • 感谢您的回答。就像其他答案一样,这很有效。
猜你喜欢
  • 2014-06-29
  • 2016-01-17
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
相关资源
最近更新 更多