Ver Mensaje Individual
  #12 (permalink)  
Antiguo 31/03/2014, 08:34
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: consulta sacando datos de tres tablas

Si esto
Código MySQL:
Ver original
  1. SELECT i.id_inmueble, COUNT(c.codigo_inmueble_es) cuenta, ts.id_servicio, SUM(ts.valor) totalServicio
  2. FROM `inmuebles` i LEFT JOIN `tbl_servicios_inmuebles` `c` ON i.`id_inmueble` = `c`.`codigo_inmueble_es`
  3. INNER JOIN tbl_servicios ts ON c.codigo_servicio = ts.id_servicio
  4. WHERE `c`.`codigo_inmueble_es` IS NULL
  5. GROUP BY i.id_inmueble
te devuelve un conjunto vacío, eso sólo podría darse si no hubiese inmuebles sin algún servicio. Pero de todos modos está mal escrito, porque en esa query estás buscando exclusivamente los inmuebles sin servicios, y no el resto.
Las condiciones de búsqueda deben ser entendidas con precisión. No te olvides jamás que el SQL nunca se equivoca. El que se equivoca es el que escribe las condiciones.

Si lo que necesitas es que estén todos los casos debe haber una condición tal que se cumpla, y otra que indica que no haya relaciones. NULL serán todos los casos de Inmbuebles que no se relacionan con servicios, pero la primera condición es mandatoria.
Por otro lado, recuerda que NULL en una columna, tiene un valor de ordenamiento, por lo cual el ORDER BY debe considerar ese caso también.

Yo te propondría:
Código MySQL:
Ver original
  1.     i.id_inmueble,
  2.     COUNT(c.codigo_inmueble_es) cuenta,
  3.     IFNULL(ts.id_servicio, '') id_servicio
  4.     IFNULL(SUM(ts.valor), 0.0) totalServicio -- Esto es para que controle la salida por NULL
  5. FROM `inmuebles` i
  6.     LEFT JOIN `tbl_servicios_inmuebles` c ON i.`id_inmueble` = `c`.`codigo_inmueble_es`
  7.     INNER JOIN tbl_servicios ts ON c.codigo_servicio = ts.id_servicio
  8. WHERE TRUE -- Esto es para que puedan salir todos los relacionados con algo
  9.     OR `c`.`codigo_inmueble_es` IS NULL -- Esto para que también salgan los no relacionados
  10. GROUP BY i.id_inmueble

Una nota: Pongo INNER JOIN en el segundo JOIN porque para que se cumpla que haya relación con la segunda tabla, forzosamente tiene que existir un registro en la segunda tabla, y se cumpliría la relación.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)