我有這樣的查詢:如何使LEFT JOIN與MySQL中的分組/計數工作?
SELECT type.id, type.name, COUNT(*) AS tot
FROM page
LEFT JOIN type ON page.type=type.id
GROUP BY type.id
然而,這並不能選擇所有的類型:它忽略掉那些沒有在頁表還沒有任何類型的。我只想讓它列出每個類型的數字,表示有多少頁面有這種類型,其中包括0類型不會發生的地方。我需要不同的連接嗎?
我有這樣的查詢:如何使LEFT JOIN與MySQL中的分組/計數工作?
SELECT type.id, type.name, COUNT(*) AS tot
FROM page
LEFT JOIN type ON page.type=type.id
GROUP BY type.id
然而,這並不能選擇所有的類型:它忽略掉那些沒有在頁表還沒有任何類型的。我只想讓它列出每個類型的數字,表示有多少頁面有這種類型,其中包括0類型不會發生的地方。我需要不同的連接嗎?
改爲做一個RIGHT JOIN
。試試這個:
SELECT type.id, type.name, COUNT(page.type) AS tot
FROM page
RIGHT JOIN type ON page.type=type.id
GROUP BY type.id
請注意不同的計數方式。對於沒有 頁面的類型,page.type將爲NULL
。當做這些行時將被忽略COUNT
[編輯]這裏是一個例子。如果我們有如下的數據:
type id name 1 A 2 B 3 C page id type 1 1 2 1 3 2
如果我們這樣做了JOIN
喜歡在我的答案(沒有GROUP BY
或COUNT
),我們的結果集將是這樣的:
type.id type.name page.id page.type 1 A 1 1 1 A 2 1 2 B 3 2 3 C NULL NULL
現在,當我們做一個GROUP BY
和COUNT(type.id)
,我們正在計數行 其中type.id不爲NULL。這將是所有行:結果是2對於 和1 B和C.
如果我們這樣做,而不是COUNT(page.type)
,我們可以得到2 A,1 B和0 C(因爲 page.type
是NULL
對於C !)
USE合併成NULL值,以GROUP BY
SELECT
COALESCE(type.id, 0),
COALESCE(type.name, 'NoType'),
COUNT(*) AS tot
FROM
page
LEFT JOIN
type
ON
page.type=type.id
GROUP BY
COALESCE(type.id, 0),
COALESCE(type.name, 'NoType')
左連接帶回所有從表中的行上聯接表達式的左側,不管它們在桌子上存在的權利側面試試這個(切換表達式的兩邊):
SELECT type.id, type.name, COUNT(*) AS tot
FROM type
LEFT JOIN page ON type.id=page.type
GROUP BY type.id, type.name
我在正確閱讀你的答案之前使用了count(*),並且丟失的類型返回2作爲計數。使用像你說的count(page.type)給出0.爲什麼會發生這種情況? – DisgruntledGoat 2009-10-01 19:18:56
看來,使用count(type.id)也返回2。 – DisgruntledGoat 2009-10-01 19:30:25
'COUNT(*)'統計所有行。 'COUNT(page.type)'只對page.type不爲NULL的行進行計數。當你在我的答案中進行JOIN時,沒有'pages'的'types'的行將所有'page'列設置爲NULL。當我們做'COUNT(page.type)'時,我們只計算有'頁面'的'類型'的行(頁面列不爲空)。 – hrnt 2009-10-01 19:42:55