我有一个关于电影的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
来编写?
UPD:
我从表中添加示例数据。所以,对于movie
它来说:
1 | "American Horror Story" | "2011–" | 8.2 | "60 min" | "Both physical..."
来自actor
表的数据:
1 | Evan Rachel Wood
来自movie_actor_mapping
:
1 | 21 | 1
答案 0 :(得分: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
...正在选择具有评级的电影,对演员进行分组并通过评级对其进行排序
答案 1 :(得分:0)
尝试:
my_secure_rng.randrange(n, m)
答案 2 :(得分:0)
当您使用GROUP BY
时,您需要对那些不用于分组的返回值进行一些聚合操作(例如,COUNT,MAX,MIN等)。
如果你想要的是获得特定电影的所有记录在一起的电影列表,你可以使用ORDER BY
子句。在您的情况下,它可能是movie_id
。