2011-02-14 6 views
6

Tengo dos tablas, una llamada calendarios y la otra llamada eventos. Puede haber múltiples calendarios y múltiples eventos en un calendario. Quiero seleccionar cada calendario, obteniendo también la cantidad de eventos en el calendario.SQL: Obtenga el recuento de las filas devueltas desde una combinación izquierda

Esto es lo que tengo:

SELECT C.*, COUNT(*) AS events FROM `calendars` AS C 
    LEFT JOIN `events` E ON C.ID=E.calendar 
    GROUP BY C.ID 

Pero eso no funciona. Los elementos sin eventos aún devuelven 1. Alguna idea?

Respuesta

7

El problema es que estás contando filas, y un calendario que no tiene eventos, todavía tiene una fila de su calendario.

Prueba esto:

SUM(case when e.Calendar is null then 0 else 1 end) 
+0

Esto funcionó perfectamente y no involucró sub-selecciones que es ineficiente. ¡Gracias! –

+0

Esto es genial, gracias! – dimsuz

18

Es necesario utilizar

COUNT(E.calendar) 

En filas sin coincide con el valor de esto será NULL y NULL valores no se cuentan.

+2

Wow! esto es incluso más simple que la respuesta aceptada, ¡gracias! – dimsuz

1

¿Qué tal:

SELECT C.*, (SELECT COUNT(*) FROM events E WHERE E.calendar=C.ID) as NumEvents 
FROM calendars C 
0

probar esto:

SELECT C.*, 
    (
     SELECT COUNT(*) 
     FROM [events] AS E 
     WHERE E.calendar = C.ID) AS [events] 
FROM [calendars] AS C; 
Cuestiones relacionadas