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

Así que esto funciona genial, excepto que no devuelve una categoría que tiene un recuento de krits 0 en la categoría.mySQL JOIN no devolverá resultados con 0 count

lo hará si me quite la instrucción WHERE pero necesito el DONDE sólo para seleccionar los krits donde el campo aprobado = 1

Respuesta

2

Prueba esto:

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

que funcionará siempre y cuando aprobado se define en la tabla como NOT NULL. De lo contrario, cualquier valor NULL en aprobado devolvería como falsos positivos en la consulta general. – Cfreak

6

Cada vez que se hace referencia a una columna de una left joined table en la cláusula where (que no sea la prueba de valores NULL), fuerza que join se comporte como una unión interna. En cambio, saque la prueba de la cláusula where y hágalo parte de la condición de unión.

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

De la lectura de la consulta, parece que desea llamar categorías y, para cada categoría, que desea un recuento de Krits (aprobado) para las respectivas categorías, y cuando no hay ninguno, todavía quieren que la Categoría , pero muestran el conteo de 0 ...

probar este

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