2009-10-01 137 views
1

我有這樣的查詢:如何使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類型不會發生的地方。我需要不同的連接嗎?

回答

3

改爲做一個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 BYCOUNT),我們的結果集將是這樣的:

 
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 BYCOUNT(type.id),我們正在計數行 其中type.id不爲NULL。這將是所有行:結果是2對於 和1 B和C.

如果我們這樣做,而不是COUNT(page.type),我們可以得到2 A,1 B和0 C(因爲 page.typeNULL對於C !)

+0

我在正確閱讀你的答案之前使用了count(*),並且丟失的類型返回2作爲計數。使用像你說的count(page.type)給出0.爲什麼會發生這種情況? – DisgruntledGoat 2009-10-01 19:18:56

+0

看來,使用count(type.id)也返回2。 – DisgruntledGoat 2009-10-01 19:30:25

+1

'COUNT(*)'統計所有行。 'COUNT(page.type)'只對page.type不爲NULL的行進行計數。當你在我的答案中進行JOIN時,沒有'pages'的'types'的行將所有'page'列設置爲NULL。當我們做'COUNT(page.type)'時,我們只計算有'頁面'的'類型'的行(頁面列不爲空)。 – hrnt 2009-10-01 19:42:55

0

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') 
2

左連接帶回所有從表中的行上聯接表達式的左側,不管它們在桌子上存在的權利側面試試這個(切換表達式的兩邊):

SELECT type.id, type.name, COUNT(*) AS tot 
FROM type 
LEFT JOIN page ON type.id=page.type 
GROUP BY type.id, type.name