2011-06-24 20 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 

これは、カテゴリー内でkritsが0のカテゴリを返さないことを除いて、素晴らしいことです。mySQL JOINは0カウントの結果を返すことはありません

は、それは私がWHERE文を削除するかどうかが、私はこれを試してみてください唯一のフィールドが= 1

答えて

2

を承認kritsを選択するために、WHEREが必要:

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として表に定義されているお試しください... 0の数を示しています。そうしないと、承認されたNULL値はすべてクエリ全体で誤検出となります。 – Cfreak

6

任意の時間をあなたから列を参照します(NULL値のテスト以外の)where句の左結合テーブルを使用すると、その結合が強制的に内側結合のように動作します。代わりに、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(承認)のカウントをしたい、と何も存在しない場合、あなたはまだカテゴリーをしたいですしかし、

は承認限り動作します。この

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 
関連する問題