使用INNER JOIN,GROUP BY和WHERE进行SELECT

时间:2016-12-06 17:44:15

标签: mysql

我有一个关于电影的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;

我还写了selectorder 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

3 个答案:

答案 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