2014-10-30 69 views
2

我正在完成一項任務,而且我需要找到導演指導由安吉麗娜朱莉主演的多部影片的導演。目前,我有這樣的:SQL - 選擇其中一個元素出現兩次的行

SELECT DISTINCT t.title, n.name 
FROM (
SELECT DISTINCT t.id theMovies 
FROM name n 
INNER JOIN cast_info c 
ON (c.person_id = n.id) 
INNER JOIN title t 
ON (t.id = c.movie_id) 
WHERE n.name = 'Jolie, Angelina' 
) as newTable 
INNER JOIN title t 
ON (t.id = theMovies) 
INNER JOIN cast_info c 
ON (c.movie_id = t.id) 
INNER JOIN name n 
ON (n.id = c.person_id) 
CROSS JOIN role_type 
WHERE role = 'director'; 

什麼這個查詢目前所做的是查找電影安吉麗娜·朱莉主演的名單,然後列出了這些電影的導演。我現在需要做的只是保留導演出現在至少另一行的行。有小費嗎? 作爲參考,這裏是我正在使用的數據庫的圖表: http://i.imgur.com/kj8qVgF.png 我也是新來的SQL,所以任何改善我的查詢的建議將不勝感激!

+0

集團由和有是提示 – radar 2014-10-30 00:43:21

回答

2

我會將其分解爲多個部分並構建到最終查詢中。如果您是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小提琴進行測試,因爲它目前不工作,但我會盡快做到這一點。有些東西可能需要調整,但讓我知道這是否有幫助。

+0

感謝您的詳細迴應!邏輯是有道理的,但由於某種原因它沒有行 - 我會讓你知道,如果我能弄清楚什麼是錯的。 – 2014-10-30 20:02:02

+0

@JoeBalin聽起來不錯,我會告訴你,如果我曾經用一些虛擬數據進行測試。隨意測試每一點 - 確保安吉麗娜朱莉電影查詢工作,然後導演查詢,等等。也許問題在其中之一。 – AdamMc331 2014-10-30 20:12:44

+0

顯然有與角色類型的連接 - 我用交叉連接,而不是它的工作。 – 2014-10-30 20:25:47

0

請嘗試:

SELECT 
     t.title 
    , n.name 
FROM title t 
     INNER JOIN cast_info c 
        ON t.id = c.movie_id 
     INNER JOIN name n 
        ON c.person_id = n.id 
     INNER JOIN role_type r 
        ON c.person_role_id = r.id 
     INNER JOIN (
        SELECT 
         c.person_id 
         , r.id 
        FROM cast_info c 
         INNER JOIN role_type r 
            ON c.person_role_id = r.id 
        WHERE r.role = 'director' 
         AND c.movie_id IN (
           SELECT DISTINCT 
            c.movie_id 
           FROM name n 
            INNER JOIN cast_info c 
               ON c.person_id = n.id 
           WHERE n.name = 'Jolie, Angelina' 
         ) 
        GROUP BY 
         c.person_id 
         , r.id 
        HAVING COUNT(*) > 1 
      ) d 
        ON c.person_id = d.person_id 
         AND r.id = d.id 
; 

嘗試多部分查詢「部分中的」如果似乎工作沒有,這有助於確定哪些可以失敗

-- 1 
SELECT DISTINCT 
    c.movie_id 
FROM name n 
    INNER JOIN cast_info c 
       ON c.person_id = n.id 
WHERE n.name = 'Jolie, Angelina' 
; 

-- 2 
SELECT 
    c.person_id 
    , r.id 
FROM cast_info c 
    INNER JOIN role_type r 
       ON c.person_role_id = r.id 
WHERE r.role = 'director' 
GROUP BY 
    c.person_id 
    , r.id 
HAVING COUNT(*) > 1 
; 

-- 3 
SELECT 
    c.person_id 
    , r.id 
FROM cast_info c 
    INNER JOIN role_type r 
       ON c.person_role_id = r.id 
WHERE r.role = 'director' 
    AND c.movie_id IN (
      SELECT DISTINCT 
       c.movie_id 
      FROM name n 
       INNER JOIN cast_info c 
          ON c.person_id = n.id 
      WHERE n.name = 'Jolie, Angelina' 
    ) 
GROUP BY 
    c.person_id 
    , r.id 
HAVING COUNT(*) > 1 
; 
+0

它沒有找到任何行。 – 2014-10-30 00:51:59

+0

嘗試「部分」我加入到答案中...我無法保證數據 – 2014-10-30 01:57:03

+0

第二部分是停止獲取行的位置。 – 2014-10-30 01:59:13