2012-08-07 20 views
5

Necesito crear una consulta en mysql que devolverá 12 filas (una fila para cada mes) que selecciona el nombre del mes y el recuento de registros para el mes dado. Tengo dos tablas, una months_tbl y events_tbl. Cada registro en events_tbl tiene una columna de fecha y hora y una columna company_id.mysql seleccione el recuento de registros para cada mes

Actualmente estoy haciendo algo como (nótese que no tengo la cláusula DONDE Company_id aún):

SELECT months_tbl.month, COUNT(events_tbl.event_id) cnt 
FROM months_tbl 
LEFT JOIN events_tbl ON months_tbl.month_id = MONTH(events_tbl.appt_date_time) 
GROUP BY months_tbl.month 
ORDER BY months_tbl.month_id ASC; 

Esto devuelve algo así como lo que estoy esperando (12 filas seleccionadas, con un recuento de eventos para el mes, o cero si no hubo ninguno):

**month** **cnt** 
January  0 
February  0 
March  0 
April  0 
May   0 
June   0 
July   0 
August  88 
September 99 
October  120 
November  0 
December  9 

sin embargo, está devolviendo todos los registros independientemente de la empresa. Necesito para asegurarse de que la consulta es filtrada por lo tanto, he añadido la cláusula where:

SELECT months_tbl.month, COUNT(events_tbl.appt_id) cnt 
FROM months_tbl 
LEFT JOIN events_tbl ON months_tbl.month_id = MONTH(events_tbl.appt_date_time) 
WHERE events_tbl.company_id = 1 
GROUP BY months_tbl.month 
ORDER BY months_tbl.month_id ASC; 

cuando agrego la cláusula where mis resultados se convierten en:

**month** **cnt** 
August  88 
September 99 
October  120 
December  9 

Cualquier idea por qué estoy perdiendo todo los otros meses registra cuando agrego la cláusula where, aunque estoy usando una combinación de la izquierda?

+0

¿Te ayudó mi solución? – arnoudhgz

Respuesta

6

Está utilizando un LEFT JOIN, pero en su donde comunicado su convirtiéndolo en un 'normal' JOIN

intentar escribir así:

SELECT months_tbl.month, COUNT(events_tbl.appt_id) cnt 
FROM months_tbl 
    LEFT JOIN events_tbl ON (months_tbl.month_id = MONTH(events_tbl.appt_date_time) 
    AND events_tbl.company_id = 1 
) 
GROUP BY months_tbl.month 
ORDER BY months_tbl.month_id ASC; 

Nota del AND events_tbl.company_id = 1 está en el LEFT JOIN

Cuestiones relacionadas