2016-12-06 54 views
0

我对电影3个MySQL表。第一个是movie,二是actor和最后一个是movie_actor_mapping有内选择加入,GROUP BY BY和WHERE

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; 

此外,我写了一个selectorderSELECT * 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

可以你请给我一些样本数据和预期产出? – Faisal

+0

Hi @Faisal,我更新了我的文章! – rel1x

+0

您的样品数据不清楚,请尝试添加更多的细节,如更多列 – Faisal

回答

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 

...是通过等级选择与评价的电影,演员群体和订单他们

+0

嗨,谢谢你的答案!也许对你我的问题太简单了,但对我来说不是:)。你的查询做我需要的,谢谢! – rel1x

0

尝试:

SELECT *, group_concat(a.name order by rating desc 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 
WHERE rating is not null 
GROUP BY m.movie_id; 
0

当你使用GROUP BY,您需要对那些未用于分组的返回值(例如,COUNT,MAX,MIN等)执行一些聚合操作。

如果你想要的是让电影在那里特定电影的所有记录都是在一起的列表,你可以使用ORDER BY条款。在你的情况下,它可能是movie_id