使用中间表查询多类型电影的MySQL
我几乎不使用MySQL,所以我对这个很陌生。我的最终目标是有一个列表,我可以将其放入Java中,其中包含电影id、电影名称和类型列表。我只是想弄明白一个SQL查询(以便以后可以解析其他内容)。我有三张桌子:使用中间表查询多类型电影的MySQL,mysql,sql,Mysql,Sql,我几乎不使用MySQL,所以我对这个很陌生。我的最终目标是有一个列表,我可以将其放入Java中,其中包含电影id、电影名称和类型列表。我只是想弄明白一个SQL查询(以便以后可以解析其他内容)。我有三张桌子: CREATE TABLE `movies` ( `id` int NOT NULL AUTO_INCREMENT, `title` varchar(100) NOT NULL DEFAULT '', `year` int NOT NULL, PRIMARY KEY(`id`)
CREATE TABLE `movies` (
`id` int NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL DEFAULT '',
`year` int NOT NULL,
PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `genres` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `genres_in_movies` (
`genre_id` int NOT NULL,
`movie_id` int NOT NULL,
FOREIGN KEY (`genre_id`) REFERENCES `genres`(`id`),
FOREIGN KEY (`movie_id`) REFERENCES `movies`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
假设我的表具有以下值:
MOVIES
------
1 Zoolander 2001
2 Citizen Kane 1941
3 Psycho 1960
GENRES
------
1 Comedy
2 Horror
3 Drama
4 Suspense
5 Romance
6 Documentary
GENRES_IN_MOVIES (genre_id, movie_id)
------
1 1 -- Comedy - Zoolander
3 2 -- Drama - Citizen Kane
4 2 -- Suspense - Citizen Kane
2 3 -- Horror - Psycho
5 3 -- Romance - Psycho
4 3 -- Suspense - Psycho
我希望查询具有以下输出:
MOVIE LIST
------
1 Zoolander 2001 Comedy
2 Citizen Kane 1949 Drama, Suspense
3 Psycho 1960 Horror, Romance, Suspense
我尝试了以下查询:
SELECT movies.*, genres.name
FROM movies
INNER JOIN genres_in_movies ON genres_in_movies.movie_id = movies.id
INNER JOIN genres ON genres_in_movies.genre_id = genres.id
GROUP BY movies.title;
但它只会给我一个流派名称。看起来是这样的:
MOVIE LIST
------
1 Zoolander 2001 Comedy
2 Citizen Kane 1949 Drama
3 Psycho 1960 Horror
如何检索所有类型?您可以使用
group\u concat
将多个值放在一起
SELECT m.id, m.title, m.year,
group_concat(g.name) as genres
FROM movies m
INNER JOIN genres_in_movies ON gm.movie_id = m.id
INNER JOIN genres ON gm.genre_id = g.id
GROUP BY m.id, m.title, m.year
你考虑过group_concat吗?@jarlh我会查一下,老实说,我对SQL还是很陌生的。一般的group BY规则说:“如果指定了group BY子句,SELECT列表中的每个列引用必须标识一个分组列或是一个set函数的参数。”(不过,较旧的MySQL版本不在乎,但较新的版本在乎!)