Si esto
Código MySQL:
Ver originalSELECT i.id_inmueble
, COUNT(c.codigo_inmueble_es
) cuenta
, ts.id_servicio
, SUM(ts.valor
) totalServicio
FROM `inmuebles` i
LEFT JOIN `tbl_servicios_inmuebles` `c` ON i.
`id_inmueble` = `c`.
`codigo_inmueble_es` INNER JOIN tbl_servicios ts
ON c.codigo_servicio
= ts.id_servicio
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 i.id_inmueble,
COUNT(c.codigo_inmueble_es
) cuenta
, IFNULL(ts.id_servicio
, '') id_servicio
IFNULL(SUM(ts.valor
), 0.0) totalServicio
-- Esto es para que controle la salida por NULL LEFT JOIN `tbl_servicios_inmuebles` c
ON i.
`id_inmueble` = `c`.
`codigo_inmueble_es` INNER JOIN tbl_servicios ts
ON c.codigo_servicio
= ts.id_servicio
WHERE TRUE -- Esto es para que puedan salir todos los relacionados con algo OR `c`.
`codigo_inmueble_es` IS NULL -- Esto para que también salgan los no relacionados
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.