2016-12-06 42 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