首页 > 解决方案 > 如何使用外键链接连接一对多属性

问题描述

我有下面的架构。我正在尝试加入genres 并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

标签: mysqlsqldatabase

解决方案


使用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;

推荐阅读