Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Devolver valores nulos en consulta con clausulas WHERE en un LEFT JOIN

Estas en el tema de Devolver valores nulos en consulta con clausulas WHERE en un LEFT JOIN en el foro de Mysql en Foros del Web. Buenas: Llevo ya bastante tiempo dándole vueltas y no encuentro ninguna sintaxis que funcione. Os explico lo que quiero hacer: Hay 4 tablas unidas con ...
  #1 (permalink)  
Antiguo 05/03/2012, 09:22
 
Fecha de Ingreso: diciembre-2011
Mensajes: 35
Antigüedad: 13 años
Puntos: 2
Devolver valores nulos en consulta con clausulas WHERE en un LEFT JOIN

Buenas:

Llevo ya bastante tiempo dándole vueltas y no encuentro ninguna sintaxis que funcione.

Os explico lo que quiero hacer:
  • Hay 4 tablas unidas con JOIN, llamémosles T1,T2,T3 y T4.
  • Van todas enlazadas en línea. Es decir: la T1 tiene un JOIN con la T2, la T2 con la T3 y la T3 con la T4.
  • Entre la T2 y la T3 va un LEFT JOIN. Es decir, tendríamos:
(T1) INNER JOIN (T2) LEFT JOIN (T3) INNER JOIN (T4)
  • Necesito un COUNT de la parte T3-T4.
  • Necesito agrupar los valores según T1.
  • En T3 y en T4 tengo respectivas cláusulas WHERE.



La consulta que he escrito es la siguiente:


Código MySQL:
Ver original
  1. SELECT T1.C11,T2.C21,T2.C22,COUNT(T3.C31) AS column_count
  2. FROM table2 AS T2
  3. INNER JOIN table1 AS T1 ON T2.C23=T1.C12
  4. LEFT JOIN table3 AS T3 ON T2.C21=T3.C32
  5. INNER JOIN table4 AS T4 ON T3.C31=T4.C41
  6. WHERE T1.C13='4' AND T3.C32='1' AND T4.C42='7'
  7. GROUP BY T2.C21
  8. ORDER BY T1.C14 ASC,T2.C22 ASC




Problema? No me devuelve los resultados en los que COUNT es 0.

He probado ya:
  • Mover las cláusulas sobre T3 y T4 junto a las condiciones de los JOIN de esas mismas tablas.
  • Cambiar T3.C32='1' por (T3.C32='1' OR T3.C32=NULL) or (T3.C32='1' OR ISNULL(T3.C32)) y lo mismo con la cláusula de T4.
Y nada. No ha funcionado ninguna de las dos ideas.


Alguien tiene una solución?


Muchas gracias por adelantado!

Última edición por jalde; 05/03/2012 a las 10:13
  #2 (permalink)  
Antiguo 05/03/2012, 13:13
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 11 meses
Puntos: 447
Respuesta: Devolver valores nulos en consulta con clausulas WHERE en un LEFT JOIN

Hola jalde:

No entendí cual es el problema, pero según el planteamiento que pones creo que es aquí donde puede haber un error.

Código:
LEFT JOIN table3 AS T3 ON T2.C21=T3.C32
INNER JOIN table4 AS T4 ON T3.C31=T4.C41
Al inicio de tu post mencionas que tu tabla T2 tiene una relación tipo LEFT JOIN, por lo tanto TAMBIÉN DEBERÍA EXISTIR UNA RELACIÓN TIPO LEFT JOIN SOBRE T4.

Código:
LEFT JOIN table3 AS T3 ON T2.C21=T3.C32
LEFT JOIN table4 AS T4 ON T3.C31=T4.C41
Otra manera de plantear este problema sería con una subconsulta:


Código:
FROM 
   table1 T1
INNER JOIN table2 T2 ON T2.C23=T1.C12
LEFT JOIN 
(
   select campos from tabla3 T3 INNER JOIN table4 AS T4 ON T3.C31=T4.C41
) T3_4 ON T2.campo = T3_4_campo
Haz la prueba y nos comentas... si continuas con problemas postea algunos datos de ejemplo de tus tablas y dinos qué esperas de salida... así podremos hacer algunas pruebas y tarde una mejor respuesta.

Saludos
Leo.
  #3 (permalink)  
Antiguo 06/03/2012, 03:46
 
Fecha de Ingreso: diciembre-2011
Mensajes: 35
Antigüedad: 13 años
Puntos: 2
Respuesta: Devolver valores nulos en consulta con clausulas WHERE en un LEFT JOIN

Muchas gracias! Ha funcionado lo de la subconsulta!

Te explico: un doble LEFT JOIN no me vale porque entonces sacaría todos los resultados de T3 independientemente de si se cumple T4. De todas maneras, lo había probado ya y me salían unos 2500 resultados cuando me tenían que salir 44, por lo que entre T3 y T4 tenía que haber un INNER JOIN sí o sí.

Cómo es de eficiente una consulta con selects anidados? Es igual que si se emplearan joins?
  #4 (permalink)  
Antiguo 06/03/2012, 08:40
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 11 meses
Puntos: 447
Respuesta: Devolver valores nulos en consulta con clausulas WHERE en un LEFT JOIN

Hola de nuevo jalde...

Siempre es preferible hacer JOIN'S en lugar de consultas anidadas, pero en ocasiones no hay de otra más que utilizarlas subconsultas para obtener los resultados deseados. El único cuidado que debes tener siempre (ya sea si usas JOIN'S o SUBCONSULTAS) es el correcto uso de índices en tus tablas. De esto, más que de otra cosa, depende realmente la eficiencia de una consulta.

Saludos
Leo.
  #5 (permalink)  
Antiguo 07/03/2012, 03:55
 
Fecha de Ingreso: diciembre-2011
Mensajes: 35
Antigüedad: 13 años
Puntos: 2
Respuesta: Devolver valores nulos en consulta con clausulas WHERE en un LEFT JOIN

Lo de los índices lo tengo todo controlado. Todas las columnas que empleo para hacer los JOINs están indexadas. Lo único es que siempre había empleado soluciones noSQL por la eficiencia del código, pero ha llegado un punto en el que tengo que unir 6 o 7 tablas al mismo tiempo y el código se hace imposible.

Gracias de nuevo!

Etiquetas: count, join, left, nulos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:39.