Ver Mensaje Individual
  #8 (permalink)  
Antiguo 14/02/2011, 09:02
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: problema con recuento de registros

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:
Código MySQL:
Ver original
  1. SELECT id_empresa
  2. FROM empresas e
  3. WHERE id_comunidad = valorbuscado;
De esas empresas, hay que averiguar las que tuvieron servicios, publicos o privados:
Código MySQL:
Ver original
  1.     e.id_empresa, IFNULL(s.id_servicio,0) id_servicio
  2.     empresas e
  3.     LEFT JOIN servicio s ON s.id_empresa = e.id_empresa
  4. 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
  1.     e.id_empresa,
  2.     SUM(IF(c.caracter = 'Público',1, 0)) Publico,
  3.     SUM(IF(c.caracter = 'Privado',1, 0)) Privado
  4.     empresas e
  5.     LEFT JOIN servicio s ON s.id_empresa = e.id_empresa
  6.     INNER JOIN  caracte c ON s.id_caracter = c.id_caracter
  7. WHERE e.id_comunidad = valorbuscado
  8. GROUP BY e.id_empresa;
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.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)