我會將其分解爲多個部分並構建到最終查詢中。如果您是SQL新手,最好將事情分解成幾個小部分,然後放回到一起。有了這些,我會重申目標:找到由導演安吉麗娜朱莉導演電影的電影。
我會通過讓所有的電影與安吉麗娜·朱莉開始:
SELECT t.id
FROM name n
JOIN cast_info c ON c.person_id = n.id
JOIN title t ON t.id = c.movie_id
WHERE n.name = 'Jolie, Angelina';
現在,讓我們這些電影的導演:通過爲person_id
SELECT c.person_id
FROM cast_info c
JOIN title t ON t.id = c.movie_id
JOIN role_type r ON r.id = c.role_id
WHERE r.role = 'director' AND t.id IN(SELECT t.id
FROM name n
JOIN cast_info c ON c.person_id = n.id
JOIN title t ON t.id = c.movie_id
WHERE n.name = 'Jolie, Angelina');
我們可以修改上面的查詢組,計數(*)大於1(表示多個電影)。
SELECT c.person_id
FROM cast_info c
JOIN title t ON t.id = c.movie_id
JOIN role_type r ON r.id = c.role_id
WHERE r.role = 'director' AND t.id IN(SELECT t.id
FROM name n
JOIN cast_info c ON c.person_id = n.id
JOIN title t ON t.id = c.movie_id
WHERE n.name = 'Jolie, Angelina')
GROUP BY person_id
HAVING COUNT(*) > 1;
現在,我們需要找到由這些導演執導的電影,並進行過濾,以便我們不會在安吉麗娜朱莉中包含電影。
SELECT t.id
FROM title t
JOIN cast_info c ON c.movie_id = t.id
JOIN role_type r ON r.id = c.role_id
WHERE r.role = 'director'
AND c.person_id IN (SELECT c.person_id
FROM cast_info c
JOIN title t ON t.id = c.movie_id
JOIN role_type r ON r.id = c.role_id
WHERE r.role = 'director' AND t.id IN(SELECT t.id
FROM name n
JOIN cast_info c ON c.person_id = n.id
JOIN title t ON t.id = c.movie_id
WHERE n.name = 'Jolie, Angelina')
GROUP BY person_id
HAVING COUNT(*) > 1)
AND t.id NOT IN(SELECT t.id
FROM name n
JOIN cast_info c ON c.person_id = n.id
JOIN title t ON t.id = c.movie_id
WHERE n.name = 'Jolie, Angelina');
我無法通過SQL小提琴進行測試,因爲它目前不工作,但我會盡快做到這一點。有些東西可能需要調整,但讓我知道這是否有幫助。
集團由和有是提示 – radar 2014-10-30 00:43:21