mysql - 可能有多个返回的匹配连接到 MySQL 表

标签 mysql

我什至不知道如何问这个问题,但这就是我的情况。我在家中使用 Plex 播放电影。我建立了一个数据库,将其转换为用作索引的网页。在这个数据库中我有一些表。主要的一个称为 movie_list。其中 1 个字段称为“Rating”,它有一个名为 assc_movie_genre 的关联表,该表仅存储从主表生成的电影 id 和从另一个关联表读取的流派 id。可以有多个与流派匹配的相同电影 ID,例如,假设《黑客帝国》属于 Action 和科幻类别,那么 MovieId 将有 2 个条目,每个条目都与相应的流派代码匹配。无论如何,我的问题是我需要一个查询(如果可能)可以将所有流派连接到适当的行。现在我有以下查询

SELECT a.`Title`,a.`Year`,b.`Rating` FROM movie_list a, assc_rating b WHERE b.`Id` = a.`Rating

但需要将其扩展为我想加入匹配的多种类型。我希望一切都有意义。

提前致谢

更新

感谢您的帮助,我也在那里。这是我当前的查询

SELECT a.Title, c.Rating, 
GROUP_CONCAT(DISTINCT b.GenreId ORDER BY b.GenreId) 
AS Genres FROM assc_movie_genre b, movie_list a, assc_rating c 
WHERE a.Id = b.MovieId AND a.Rating = c.Id group by a.Title 
ORDER BY a.Title;

但问题仍然在于我只是获取 GenreId 而不是流派名称。我假设我需要在某处放置一个选择,以便它从 assc_genres 表中提取名称,但不能 100% 确定在哪里。

这是当前输出的样子

Title                   Rating               Genres
28 Days Later...        R                    11,16,17

The concat works great and I'm so close. Thanks again

Update

Here are the queries to create my tables, you can get the structure from here (obviously)

CREATE TABLE IF NOT EXISTS `assc_genres` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`Genre` varchar(50) NOT NULL DEFAULT '0',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=latin1;


CREATE TABLE IF NOT EXISTS `assc_movie_genre` (
`MovieId` int(11) NOT NULL DEFAULT '0',
`GenreId` int(11) NOT NULL DEFAULT '0',
KEY `FK_assc_movie_genre_movie_list` (`MovieId`),
KEY `FK_assc_movie_genre_assc_genres` (`GenreId`),
CONSTRAINT `FK_assc_movie_genre_movie_list` FOREIGN KEY (`MovieId`) REFERENCES `movie_list` (`Id`),
CONSTRAINT `FK_assc_movie_genre_assc_genres` FOREIGN KEY (`GenreId`) REFERENCES `assc_genres` (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE IF NOT EXISTS `assc_rating` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`Rating` char(50) NOT NULL DEFAULT '0',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;


CREATE TABLE IF NOT EXISTS `assc_status` (
`Id` tinyint(4) NOT NULL,
`Status` char(50) NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE IF NOT EXISTS `movie_list` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`Title` varchar(100) NOT NULL DEFAULT '0',
`Year` year(4) NOT NULL DEFAULT '2000',
`Rating` int(11) NOT NULL DEFAULT '0',
`Folder` varchar(50) NOT NULL DEFAULT '0',
PRIMARY KEY (`Id`),
UNIQUE KEY `Title_Year` (`Title`,`Year`),
KEY `FK_movie_list_assc_rating` (`Rating`),
CONSTRAINT `FK_movie_list_assc_rating` FOREIGN KEY (`Rating`) REFERENCES `assc_rating` (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=614 DEFAULT CHARSET=latin1;

最佳答案

我也不确定这是否是您所要求的,但您可以连接所有 3 个表来获取数据,例如

SELECT a.`Title`,
a.`Year`,
b.`Rating` 
FROM movie_list a
JOIN assc_movie_genre c ON a.Id = c.movie_id
JOIN assc_rating b ON b.`Id` = c.genre_id;

根据您的评论,您可以使用GROUP_CONCAT(),例如

SELECT a.`Title`,
a.`Year`,
b.`Rating`,
xx.genre_list 
FROM movie_list a
JOIN ( select movie_id, genre_id, group_concat(genre) as genre_list 
from assc_movie_genre 
group by movie_id) xx ON a.Id = xx.movie_id
JOIN assc_rating b ON b.`Id` = xx.genre_id;

您可以修改您的查询,例如

SELECT a.Title, c.Rating, 
GROUP_CONCAT(DISTINCT d.`Genre` ORDER BY d.`Genre`) AS Genres 
FROM movie_list a
JOIN assc_movie_genre b ON a.Id = b.MovieId
JOIN assc_rating c ON a.Rating = c.Id 
JOIN `assc_genres` d ON b.`GenreId` = d.Id
group by a.Title 
ORDER BY a.Title;

关于mysql - 可能有多个返回的匹配连接到 MySQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35118246/

相关文章:

php - 动态下拉列表第二个列表未填充

mysql - 关系数据库设计 - 为支付类型创建一个实体类?

mysql - SQL查询优化

php - 将值保存为数据库中的变量名

mysql - 将无效的 ActiveRecord 日期插入 MySQL 数据库

php - 获取所有子类别的递归函数

php - MySql 数据复制 - 存储过程、函数和 PHP SQL 查询如何工作?

mysql - 用于创建用户和授予权限的 SQL 过程中的语法错误

mysql - Amazon Web 服务远程 mysql 访问被拒绝 'user' @'localhost' ubuntu 16.04 服务器

sql - PHP/MySQL问题,更多的是后者