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

Bu sonuç, kategoride 0 krits değerine sahip bir kategori döndürmemesi durumu dışında harika çalışır.mySQL JOIN 0 sayım

Ben NEREDE ifadeyi kaldırırız ama eğer ben bu deneyin sadece saha = 1

cevap

2

onaylı krits seçmek için WHERE gerekir:

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

olarak NOT NULL tabloda tanımlanan deneyin ... 0 sayısını göstermektedir. Aksi halde, onaylanan herhangi bir NULL değeri, genel sorguda yanlış pozitif olarak geri döner. – Cfreak

6

herhangi birine her bir bir sütuna başvuru where yan tümcesinde soldaki tablo (NULL değerlerini sınama dışında), bu birleştirmeyi bir iç birleştirme gibi davranmaya zorlarsınız. Bunun yerine, testinizi nerede kullandığınızdan emin olun ve birleştirme koşulunun bir parçası haline getirin. Eğer Kategoriler çağrı istediğiniz gibi sorgu okuyunca

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

, görünüşe ve her bir kategori için, ilgili kategoriler için Krits (onaylı) sayımını istiyor ve hiçbiri varken, hala Kategori istiyorum fakat

onaylı sürece çalışacaktır bu

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