2011-01-16 36 views
7

Estoy tratando de obtener el número de páginas abiertas por día usando la siguiente consulta.Left Outer Join no devuelve todas las filas de mi tabla izquierda?

SELECT day.days, COUNT(*) as opens 
FROM day 
LEFT OUTER JOIN tracking ON day.days = DAY(FROM_UNIXTIME(open_date)) 
WHERE tracking.open_id = 10 
GROUP BY day.days 

La salida lo consigo es la siguiente:

days opens 
1 9 
9 2 

La cosa es, en mi mesa de día, tengo una sola columna que contiene el número del 1 al 30 para representar los días en un mes . Hice una combinación externa izquierda y espero tener todos los días en la columna de días!

Pero mi consulta está haciendo eso, ¿por qué podría ser?

Gracias por cualquier ayuda.

Respuesta

14

Especifica que el tracking.open_id conectado debe ser 10. Para las otras filas, será NULL, por lo que no se mostrarán.

+0

AH! Eso tiene sentido, gracias! – Abs

+0

@Nanne Creo que se puede confundir +1 –

43

Nanne's answer dado explica por qué no obtiene el resultado deseado (su cláusula WHERE quita filas), pero no cómo solucionarlo.

La solución es cambiar el lugar donde a Y para que la condición es parte de la condición de unión, no se aplica un filtro después de la incorporación:

SELECT day.days, COUNT(*) as opens 
FROM day 
LEFT OUTER JOIN tracking 
ON day.days = DAY(FROM_UNIXTIME(open_date)) 
AND tracking.open_id = 10 
GROUP BY day.days 

Ahora todas las filas de la tabla de la izquierda estarán presentes en el resultado.

+1

alternativamente, la cláusula where podría haberse cambiado a 'WHERE (tracking.open_id IS NULL o tracking.open_id = 10)' aunque prefiero poner el predicado en la cláusula join como marca lo hice, ya que creo que tiene más sentido allí. – goat

+2

@chris: funciona cuando falla la unión, pero no funciona en el caso en que la unión se realiza correctamente pero la fila de unión tiene 'tracking.open_id' igual a algo distinto de 10. En este caso, la fila se eliminará. –

+0

doh! Tienes razón. – goat

Cuestiones relacionadas