2017-03-05 59 views
0

我正在處理3個表格:actors,films和actor_film。演員和電影只有2個字段:id(主鍵)和名字。 Actor_film也有兩個字段,演員和電影,這兩個字段分別代表演員和電影ID。所以如果一部電影裏面有4個演員,就會有4部actor_film條目和4部不同的演員。嵌套SELECT語句重複條目和COUNT

我的問題是,鑑於某個演員的ID,我想返回該電影中的演員ID,演員姓名,電影名稱和演員總數。但是,我想要展示的唯一演員是包含某些字母的演員。

讓我通過一個例子來說明問題。說湯姆漢克斯只有兩部電影,阿甘正傳和拯救大兵瑞恩,而且我正在尋找那些兩部電影中名字中都有「加里」或「馬特」的演員。進一步假設在阿甘正傳中有4個演員,在Saving Private Ryan中有5個演員。然後,我唯一會想回報將是(沒有列名,當然)

actor id | actor name | film name   | # actors 
abcdefg | Gary Sinise | Forrest Gump  | 4 
hijklmn | Matt Damon | Saving Private Ryan | 5 
opqrstu | Paul Giamatti | Saving Private Ryan | 5 

目前,我對那裏的方式75%通過:

SELECT actor.id, actors.name, films.name, 
FROM (
    SELECT actor_film.film 
    FROM actor_film, actors 
    WHERE actor_film.actor = actors.id 
) AS a, actor_film, actors, films 
WHERE actor_film.film = a.film 
    AND actors.id = actor_film.actor 
    AND films.id = a.film; 

這是返回的東西,如:

arnie | Arnold Schwarzenegger | Around the World in 80 Days 
arnie | Arnold Schwarzenegger | Around the World in 80 Days 

對於有2個演員在其中的電影。換句話說,我無法將電影中所有不同的演員都拉出來,但隱含地明確地指出了這一點,並且沒有明確地使用COUNT

無論如何,我想我正在尋找某種INNER JOIN或嵌套SELECT,但我是SQLite3的新手,不知道如何將它們結合在一起。任何解決方案都會很棒,而且最重要的解釋也會很棒。

回答

0

您不應該使用舊式連接。他們在95年年紀較大時,允許你做更加清晰的新標準被制定爲標準。

我注意到,你也可以使用複數爲你的表名(例如,「演員」)的標準樣式是用奇異的表的表名(例如,「演員」)

我用這兩個建議下面,我也告訴你每一步。我建議你運行每個步驟的查詢並查看輸出,以便了解因爲您是SQL新手而一切正常。

好吧,讓我們一步一步的問題。首先要看到每個演員和電影他們在(你的前3列)做到這一點:

SELECT a.id as actor_id, a.name as actor_name, f.name as film_name 
FROM actor as a 
JOIN actor_film af on a.id = af.actor 
JOIN film as f on af.film = f.id 

你的最後一欄可以用下面的查詢中找到:

SELECT af.film as film_id, count(*) as c 
FROM actor_film as af 
GROUP BY af.film 

現在我們只它們連接在一起

SELECT a.id as actor_id, a.name as actor_name, f.name as film_name, fc.c as num_actors 
FROM actor as a 
JOIN actor_film af on a.id = af.actor 
JOIN film as f on af.film = f.id 
JOIN (
    SELECT af.film as film_id, count(*) as c 
    FROM actor_file as af 
    GROUP BY af.film 
) as fc on af.film = fc.film_id 

如果你願意,你可以添加一個

WHERE a.name = 'Gary' OR a.name = 'Matt' 

取決於您可能需要的平臺

WHERE lower(a.name) = 'gary' OR lower(a.name) = 'matt' 
+0

謝謝!如果我想進一步只顯示其名字包含某些字母的演員,我會在那裏放置?在第一個JOIN? – ohjava

+0

@ohjava - 我爲你放了一個where子句的例子。 – Hogan