2010-02-02 11 views
10

Tengo 2 tablas, campañas y campaign_codes:MySQL - filas de conteo y dejaron unirse a un problema

Campañas: Identificación, partner_id, estado

campaign_codes: ID, código, estado

quiero llegar un recuento de todos los códigos de campaña para todas las campañas DONDE campaign_codes.status es igual a 0 O donde no hay registros de códigos de campaña para una campaña.

tengo el siguiente código SQL, pero por supuesto la declaración DONDE elimina aquellas campañas que no tienen registros correspondientes en campaign_codes (Quiero esas campañas con cero campaign_codes también)

SELECT 
    c.id AS campaign_id, 
    COUNT(cc.id) AS code_count 
FROM 
    campaigns c 
LEFT JOIN campaign_codes cc on cc.campaign_id = c.id 
WHERE c.partner_id = 4 
AND cc.status = 0 
GROUP BY c.id 

Respuesta

19

que había optar por algo como:

SELECT 
    c.id AS campaign_id, 
    COUNT(cc.id) AS code_count 
FROM 
    campaigns c 
LEFT JOIN campaign_codes cc on cc.campaign_id = c.id 
AND cc.status = 0 -- Having this clause in the WHERE, effectively makes this an INNER JOIN 
WHERE c.partner_id = 4 
GROUP BY c.id 

Moviendo el AND a la cláusula de combinación hace que la unión tenga éxito o fracase, manteniendo crucialmente filas resultantes en donde Ther e no es una fila coincidente en la tabla 'derecha'.

Si estuviera en el WHERE, las comparaciones con NULL (donde no hay campaign_code) fallarían y se eliminarían de los resultados.

+0

¡Gracias! Eso hizo el truco. Me encantaría una explicación o un indicador de algunas lecturas sobre cómo se usa el AND. – k00k

+0

Lo que estoy preguntando es si alguien puede explicarme o señalarme un recurso al colocar el AND antes de WHERE. No lo he usado en el pasado y no estoy seguro si realmente lo entiendo. – k00k

+0

@ k00k agregó un poco más de detalles en cuanto a "por qué" –

3
SELECT 
    c.id AS campaign_id, 
    COUNT(cc.id) AS code_count 
FROM 
    campaigns c 
LEFT JOIN campaign_codes cc on cc.campaign_id = c.id 
    AND c.partner_id = 4 
    AND cc.status = 0 
GROUP BY c.id