mysql - 如何使用外键链接连接一对多属性
问题描述
我有下面的架构。我正在尝试加入genre
s 并genre_of_movie
一起拥有电影类型的逗号分隔符列表。现在非常确定该怎么做。
CREATE TABLE movies (
id integer AUTO_INCREMENT primary key,
name varchar(100)
);
CREATE TABLE genres (
id integer AUTO_INCREMENT primary key,
name varchar(100)
);
CREATE TABLE genre_of_movie (
id integer AUTO_INCREMENT primary key,
movie_id integer,
genre_id integer,
FOREIGN KEY (movie_id) REFERENCES movies(id),
FOREIGN KEY (genre_id) REFERENCES genres(id)
);
INSERT INTO movies (name) VALUES ('Joker');
INSERT INTO genres (name) VALUES ('actions'), ('romance'), ('drama');
INSERT INTO genre_of_movie (movie_id, genre_id) VALUES (1, 1), (1, 3);
我想要的是:
+-------+---------------+
| movie | genre_list |
+-------+---------------+
| Joker | action, drama |
+-------+---------------+
我的尝试
SELECT m.name, g.name
FROM movies m
JOIN genre_of_movie gom ON m.id = gom.movie_id
JOIN genres g ON gom.genre_id = g.id
解决方案
使用GROUP_CONCAT
:
SELECT m.name, GROUP_CONCAT(g.name SEPARATOR ', ') AS genre_list
FROM movies m
INNER JOIN genre_of_movie gom ON m.id = gom.movie_id
INNER JOIN genres g ON gom.genre_id = g.id
GROUP BY m.name;
演示
请注意,从技术上讲,两部不同的电影可能碰巧具有相同的名称。id
在这种情况下,我们可以通过 movie和聚合,在这种情况下name
显示不同的电影id
值:
SELECT m.id, m.name, GROUP_CONCAT(g.name SEPARATOR ', ') AS genre_list
FROM movies m
INNER JOIN genre_of_movie gom ON m.id = gom.movie_id
INNER JOIN genres g ON gom.genre_id = g.id
GROUP BY m.id, m.name;
推荐阅读
- ignite - 从 JDBC Thin Driver 使用 Apache ignite 时如何使用 NearCache?
- python - 如何在 Python 中使用补间而不损失准确性?
- flutter - 创建设备高度背景元素
- javascript - “不要在突变处理程序之外改变 vuex 存储状态”错误,即使在为 prop 使用计算 var 之后也是如此
- javascript - 当我尝试使用更新方法时,为什么 mongo 说这不是有效的 JavaScript 对象?
- android - 如何使用 ViewPager2 更改 TabLayout 选定的选项卡图标
- database - 如何使用 SQLite DB 浏览器将 Create table 语句从一个数据库复制到另一个数据库?
- c# - 在结构中读取 Txt 文件 - 如何在 C#.net 中读取结构中 Cobol 的 Occur 子句
- android - 有什么方法可以在不调用 onChanged 方法的情况下清除 ObservableList?
- sql - 通过 SQL 中两个不同表的数据查找最高/最低值