我已閱讀placing conditions in WHERE or in JOIN does not matter。但是,我遇到了一個聽起來有點可疑的結果:結果根據我的情況而有所不同。任何人都可以向我解釋它的基本邏輯嗎?當條件放置在WHERE或LEFT JOIN中時,爲什麼COUNT中的「零」結果出現?
我有兩個虛擬表話題和問題。一個問題有一個標題和一個與主題的關係1-n,以便每個問題都與一個主題相關。然後,該問題的題目可以跨主題重複。它的結構非常糟糕,但我無法改變它:/
所有這一切都是in SQL Fiddle。
<topic> <issues>
id | name id | topic_id | title
------------ ---------------------
1 | art 1 | 1 | final
2 | music 2 | 1 | semi final
3 | sport 3 | 2 | final
4 | 2 | draft
現在我想選擇一個主題中有多少次出現在問題的列表,獲取用於時候有沒有一個0
。使用LEFT JOIN
使得它,用How to include 「zero」/「0」 results in COUNT aggregate?幫助:
SELECT
t.name, count(i.title)
FROM
topic as t
LEFT JOIN issues as i
ON t.id = i.topic_id
GROUP BY t.id;
這將返回預期的結果:
name | count
--------------
art | 2
music | 2
sport | 0
現在我想知道一個給定標題橫跨主題出現了多少次。例如,每個主題發生了多少次「最終」?這裏是顯示問題出在哪裏:
SELECT
t.name, count(i.title)
FROM
topic as t
LEFT JOIN issues as i
ON t.id = i.topic_id
AND i.title = "final" -- in the LEFT JOIN!
GROUP BY t.id;
返回:
name | count
--------------
art | 1
music | 1
sport | 0 -- yeah, sport - 0 is here
而
SELECT
t.name, count(i.title)
FROM
topic as t
LEFT JOIN issues as i
ON t.id = i.topic_id
WHERE
i.title = "final" -- in the WHERE!
GROUP BY t.id;
返回
name | count
--------------
art | 1
music | 1 -- where is sport - 0?
左連接與條件使其內連接,並將確保連接表有數據,而進行聚合。 –
@AbhikChakraborty說。您可以嘗試使用WHERE(i.title IS NULL或i.title =「final」) – ipeiro
確切地說,只有WHERE條件涉及右列表中的LEFT JOIN中的列纔有效地使其成爲INNER。 – Serg