2016-10-02 29 views
2

鑑於這些表:SQL查詢返回多個表中的元素通過一定的條件下

movie (id, name, year) 
actor (id, fname, lname) 
cast (movieid, actorid, role) 

我想找到行爲者必須在同一電影3個或更多不同的角色,在2013年,我需要的名字演員姓名,電影名稱以及他們在該電影中的角色數量。

到目前爲止,我有:

select a.fname, a.lname (select m.name (select count(distinct c.role) 
             from actor a, cast c 
             where a.id=c.actorid and           
               c.movieid=m.id and m.year = 
                    2013) 
          from movie m) 
group by a.fname, a.lname 
having count(distinct c.roles) >=3 

我的直覺是,最內側的查詢將計算每個演員在2013年打了一個電影角色的數量下一級查詢將選擇那些電影的名字而最外層將返回在每部電影中有3個或更多不同角色的演員的名字。

例如:

電影

id  name  year 
1  a   1990 
2  b   2013  
3  c   2000 
4  d   1998 
5  e   2013 

演員

id  fname  lname 
1  bob  dylan 
2  angelina jolie 
3  meghan  fox 
5  jane  doe 

蒙上

actorid movieid  role 
1   2   nanny 
1   2   maid 
1   2   butler 
2   3   main 
1   5   baby 
1   5   kid 
1   5   teen 
4   2   main 
5   4   support 

查詢應返回如下:

a.fname a.lname  m.name  count(distinct roles in movie) 
bob   dylan  a    3 
bob   dylan  e    3 

有可能是一個演員是曾在多部影片3個或更多不同的角色,在2013年在電影中的那麼鮑勃打了3個角色和電影中的E 3級的角色這兩者都是從2013年開始,其結果應清單鮑勃曾經兩次電影和3計數和3

+0

如果你對子查詢和連接不穩定,我建議通過[SQL Zoo](http://sqlzoo.net/)教程。 –

+0

這個家庭作業問題想讓你做兩個簡單的連接。 –

+2

爲什麼我們仍然在使用舊式逗號分隔符進行連接操作? *這是什麼年份? – spencer7593

回答

1

另一個與電影Ë計數這個查詢應該工作:

SELECT actor.fname, actor.lname, movie.name, count(role) 
FROM cast 
JOIN movie ON movieid = movie.id 
JOIN actor ON actorid = actor.id 
WHERE movie.year = 2013 
GROUP BY actorid, movieid 
HAVING count(role) >= 3; 

我希望它。 現在看來現在。

+0

Sry。它出什麼問題了? –

+0

@ spencer7593感謝您的評論。我編輯了我的答案。 –

+0

我忘了那個組可以包含多個屬性。謝謝。 – Misohappi

-1
SELECT a.fname, 
     a.lname, 
     m.name, 
     COUNT(DISTINCT c.role) AS cnt_roles_per_movie 
    FROM actor a, 
     cast c, 
     (SELECT id,name 
      FROM movie 
      WHERE year = 2013 
     ) m 
WHERE a.id = c.actorid 
    AND m.id = c.movieid 
GROUP BY a.fname,a.lname 
HAVING COUNT(DISTINCT c.role) >= 3 
; 
+0

我不明白內嵌視圖'm'的必要性(爲什麼我們更喜歡這只是一個連接到電影表。我不相信這會返回由OP指定的結果集。電影名稱(m.name)是不確定的...它將來自組中的電影中的某一行,但它只會返回其中一個電影名稱。 – spencer7593

+0

我選擇了2013年的所有電影,以最大限度地降低查詢成本。 – Teja

+0

在MySQL中,假設合適的索引可用,內聯視圖可能*增加*查詢的成本,與使用謂詞(WHERE子句中的條件)與電影表的聯接。 (內聯視圖將被物化爲沒有任何索引的派生表。)。 – spencer7593