A mi entender el problema de la consulta es la lógica con la que se está elaborando.
En el primer post dice que desea saber cuál es la cantidad y tipos de servicios brindados a las empresas de la zona asignada, aunque esa cantidad sea cero,
pero está basando la consulta en los servicios efectivamente brindados. Eso no está bien. SI lo que que se desea es conocer la cantidad y tipo de servicios brindados a las empresas cliente, la primer tabla que contiene todas las posibilidades no es
servicio, es
empresas.
Es decir, que lo primero a determinar es cuáles son las empresas del ámbito que se analizarán:
De esas empresas, hay que averiguar las que tuvieron servicios, publicos o privados:
Código MySQL:
Ver original e.id_empresa
, IFNULL(s.id_servicio
,0) id_servicio
empresas e
LEFT JOIN servicio s
ON s.id_empresa
= e.id_empresa
WHERE e.id_comunidad
= valorbuscado
;
Esta tabla devolverá todas los id de empresas, y NULL donde no haya servicios, entonces hay que determinar qué tipos de servicio fueron aquellos que fueron válidos, pero en vez de contarlos, hay que
sumarlos para que pueda controlarse en NULL:
Código MySQL:
Ver original e.id_empresa,
SUM(IF(c.caracter
= 'Público',1, 0)) Publico
, SUM(IF(c.caracter
= 'Privado',1, 0)) Privado
empresas e
LEFT JOIN servicio s
ON s.id_empresa
= e.id_empresa
WHERE e.id_comunidad
= valorbuscado
Aquí hay algunas observaciones a realizar:
- Si el carácter del servicio es un valor binario (de sólo dos valores posibles), crear una tabla para administrarlo, es innecesario. Con un campo BIT o BOOL alcanzaría si predefines el estado; e incluso con un ENUM sería suficiente.
- Si el id_caracter está contenido en la tabla
servicio, no se necesita en la tabla
tipo, o al menos se vuelve superfluo. Si lo vas a mantener en la tabla
tipo, hay que eliminarlo de servicio porque se vuelve redundante, y allí sí se requiere incluir la tabla
tipo. en el INNER JOIN
- Cruzar la tabla de técnicos no se requiere en tu consulta, porque no estás listando los técnicos, sólo los tipos de servicio, y para ello saber qué técnico lo realizó es irrelevante. No aporta ni saca nada, por lo tanto el JOIN con esa tabla se vuelve superfluo.