2011-06-24 49 views
5
SELECT categories.*, COUNT(categoryID) AS kritCount 
FROM categories AS categories 
LEFT JOIN krits ON categories.id = categoryID 
WHERE (krits.approved = '1') 
GROUP BY categories.id 

所以這個工程很好,除了它不返回類別中有0個krits的類別。mySQL JOIN不會返回結果0計數

它將如果我刪除了WHERE語句,但我需要的WHERE,只選擇其中場批准= 1

回答

2

的krits試試這個:

SELECT categories. * , COUNT(categoryID) AS kritCount FROM categories AS categories 
LEFT JOIN krits ON categories.id = categoryID 
WHERE (krits.approved = '1' OR krits.approved IS NULL) 
GROUP BY categories.id 
+2

批准這將只要工作表中爲NOT NULL定義。否則,批准中的任何NULL值將作爲整體查詢中的誤報返回。 – Cfreak

6

任何時候你從引用列在where子句中留下連接的表(除了測試NULL值),則強制該連接的行爲類似於內部連接。相反,將您的測試移出where子句並使其成爲連接條件的一部分。

SELECT categories. * , COUNT(categoryID) AS kritCount 
    FROM categories AS categories 
     LEFT JOIN krits 
      ON categories.id = categoryID 
       AND krits.approved = '1' 
    GROUP BY categories.id 
0

從閱讀查詢,它看起來像你想打電話類別,每個類別,您希望爲各個類別Krits(批准)的計數,並且當有沒有,你還願意類別,但顯示爲0的個性化......

試試這個

select 
     cat.*, 
     COALESCE(kc.KritCount, 0) as KritCount 
    from 
     Categories cat 
     left join (select k.CategoryID, 
          count(*) KritCount 
         from 
          Krits k 
         where 
          k.approved = '1' 
         group by 
          k.CategoryID) kc 
      on cat.id = kc.CategoryID