我有 3 个关于电影的 MySQL 表。第一个是movie
,第二个是actor
,最后一个是movie_actor_mapping
。
CREATE TABLE `movie` (
`movie_id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(50) DEFAULT NULL,
`year` varchar(9) DEFAULT NULL,
`rating` float(2,1) DEFAULT NULL,
`runtime` varchar(6) DEFAULT NULL,
`plot` varchar(1500) DEFAULT NULL,
PRIMARY KEY (`movie_id`),
UNIQUE KEY `title` (`title`)
)
CREATE TABLE `actor` (
`actor_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(40) DEFAULT NULL,
PRIMARY KEY (`actor_id`),
UNIQUE KEY `name_en` (`name`)
)
CREATE TABLE `movie_actor_mapping` (
`movie_actor_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`movie_id` int(10) unsigned DEFAULT NULL,
`actor_id` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`movie_actor_id`),
UNIQUE KEY `movie_actor_id` (`movie_actor_id`)
)
有些电影的评级为NULL
,当我执行SELECT
时,我必须选择所有具有评级的电影并按评级排序。我的 SELECT
看起来像:
SELECT *, group_concat(a.name separator ', ') as actors
FROM movie m INNER JOIN movie_actor_mapping ma
ON m.movie_id=ma.movie_id
INNER JOIN actor a
ON a.actor_id=ta.actor_id
GROUP BY m.movie_id;
我还写了一个 select
和 order
SELECT * FROM movie WHERE rating is not null ORDER BY rating DESC;
但我不这样做了解如何拆分这些查询。我知道,如果我没有 GROUP BY
- 我可以在 ON
之后编写第二个查询,但如何使用 GROUP BY
做到这一点?
更新:
我从表中添加示例数据。所以,对于电影
来说是:
1 | "American Horror Story" | "2011–" | 8.2 | "60 min" | "Both physical..."
来自actor
表的数据:
1 | Evan Rachel Wood
来自movie_actor_mapping
:
1 | 21 | 1
最佳答案
也许我不明白这个问题,因为它看起来太简单了,但是这个查询:
SELECT m.*, group_concat(a.name separator ', ') as actors
FROM movie m
INNER JOIN movie_actor_mapping ma ON m.movie_id = ma.movie_id
INNER JOIN actor a ON a.actor_id = ma.actor_id
WHERE m.rating IS NOT NULL
GROUP BY m.movie_id
ORDER BY m.rating DESC
...正在选择带有评级的电影,对 Actor 进行分组并按评级排序
关于mysql - 使用 INNER JOIN、GROUP BY by 和 WHERE 进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41001613/