2015-11-07 139 views
0

我有一個電影數據庫,其中一個表是'類別',它包含數據庫中的所有電影類型。左連接不返回左表中的所有行

運行下面的查詢:

SELECT category.name FROM category 

還給行:

Action 
Animation 
Children 
Classics 
Comedy 
Documentary 
Drama 
Family 
Foreign 
Games 
Horror 
Music 
New 
Sci-Fi 
Sports 
Travel 

我想查詢數據庫,找到每個特定類型的#一個特定的演員有一個角色,但我希望它能夠在下一列中使用#返回所有流派。這是我的初始查詢:

SELECT q1.name AS 'Film Category', COUNT(q2.name) AS '# of Films Ed Chase has appeared in' 
FROM (
    SELECT category.name FROM category 
) AS q1 
LEFT JOIN (
    SELECT category.name FROM category 
    INNER JOIN film_category ON film_category.category_id = category.category_id 
    INNER JOIN film ON film.film_id = film_category.film_id 
    INNER JOIN film_actor ON film.film_id = film_actor.film_id 
    INNER JOIN actor ON actor.actor_id = film_actor.actor_id 
    WHERE actor.first_name = 'ED' AND actor.last_name = 'CHASE' 
) AS q2 
ON q1.name = q2.name AND '# of Films Ed Chase has starred in' >= 0 
GROUP BY q2.name 
ORDER BY q2.name; 

,它給回該表,缺少一些行的(我想這給所有的流派,不只是一個人的演員有一個角色):

Film Category # of Films Ed Chase has appeared in 
Animation  0 
Action   2 
Classics  2 
Documentary  6 
Drama   3 
Foreign   2 
Music   1 
New    2 
Sci-Fi   1 
Sports   2 
Travel   1 

有趣的是,它返回'0'的'動畫',但'兒童'或'喜劇'這是我正在尋找的結果(所有類型返回)沒有行。我究竟做錯了什麼?

+0

你內心的連接讓我感到羞恥,所以它可能沒有做你想做的事。給我幾分鐘的時間來嘗試重寫它。 –

+0

你絕對確定演員的名字總是大寫嗎? –

+0

明白了。見下文。 –

回答

1

COUNT()不計數NULL,並且您的左連接將NULL放在右側表中沒有值的記錄中。你的外連接實際上是(或者應該是 - 檢查這個)返回所有需要的行,但帶聚合函數的外層選擇正在吃掉它們。

嘗試將您的count()移動到右側的子查詢中,然後在您的外部查詢中用IFNULL(q2.count, '0')替換它以將NULL替換爲零。我會注意到你應該在q1.name而不是q2.name上分組。

+0

我不確定這不是一個答案。它解釋了爲什麼他沒有得到他想要的結果(除了他得到的那個「0」),並建議對查詢進行更改以獲得期望的結果。 –

+0

沒有行返回給孩子或喜劇。這裏沒有任何東西可以解決這個問題。 – Strawberry

+0

兩個子查詢之間的左外連接將返回行'children | (NULL)'和'喜劇| (NULL)'。在最外面的查詢中對'IFNULL'的調用將用零代替那些零。 –