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

Necesito ayuda con unas consultas que no me salen.

Estas en el tema de Necesito ayuda con unas consultas que no me salen. en el foro de Mysql en Foros del Web. Que tal, necesito un poco de ayuda con una consulta que estoy tratando de hacer. Tengo las siguientes tablas y sus respectivas relaciones: http://img13.imageshack.us/i/dibujoyee.jpg/ http://img13.imageshack.us/img13/8404/dibujoyee.jpg ...
  #1 (permalink)  
Antiguo 14/03/2011, 17:16
 
Fecha de Ingreso: noviembre-2010
Mensajes: 30
Antigüedad: 13 años, 5 meses
Puntos: 0
Necesito ayuda con unas consultas que no me salen.

Que tal, necesito un poco de ayuda con una consulta que estoy tratando de hacer.

Tengo las siguientes tablas y sus respectivas relaciones:

http://img13.imageshack.us/i/dibujoyee.jpg/
http://img13.imageshack.us/img13/8404/dibujoyee.jpg (por si no se ve la primera)

Lo que necesito hacer son 3 cosas:

1- Listar aquellas empresas (solo la razón social) que estén relacionadas con aunque sea uno de los servicios que se detallan en la sentencia SQL (en el IN). Lo que he hecho es relacionar todas las tablas con INNER JOIN y en el IN() detallar las coincidencias:

Código MySQL:
Ver original
  1. SELECT empresa.razon_soc AS Empresa FROM
  2. empresa INNER JOIN emp_serv ON emp_serv.id_empresa=empresa.id INNER JOIN emp_act ON emp_act.id_empresa=empresa.id INNER JOIN servicio ON emp_serv.id_servicio=servicio.id INNER JOIN actividad ON emp_act.id_actividad=actividad.id WHERE servicio.nombre IN ('Comunicación', 'Hosting')

Esta sentencia, si bien recupera la empresa correcta (google), me la lista tres veces, es decir, me devuelve 3 registros iguales (google, google, google,). Lo que yo necesito es que me devuelva un solo registro por cada empresa que este relacionada con alguno de esos dos servicios.

2- Por otro lado, necesito hacer los mismo que lo anterior, pero restrictivamente, es decir, que la sentencia me devuelva todas las empresas que están relacionadas con TODOS los servicios que se detallen en la sentencia y no solo con alguno de ellos.

3- Finalmente, necesito hacer lo mismo que los dos puntos anteriores, pero que los servicios correspondiente se detallen a partir de una variable. Creo saber como se hace, pero por las dudas lo pregunto.

Les agradezco por su tiempo.
Saludos.

Última edición por GNULinux; 14/03/2011 a las 18:08
  #2 (permalink)  
Antiguo 15/03/2011, 01:55
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Necesito ayuda con unas consultas que no me salen.

Para el punto uno te basta con hacer un GROUP BY de empresa.razon_soc

Código SQL:
Ver original
  1. SELECT empresa.razon_soc AS Empresa
  2. FROM empresa
  3. INNER JOIN emp_serv ON
  4. emp_serv.id_empresa=empresa.id
  5. INNER JOIN emp_act ON
  6. emp_act.id_empresa=empresa.id
  7. INNER JOIN servicio ON
  8. emp_serv.id_servicio=servicio.id
  9. INNER JOIN actividad ON
  10. emp_act.id_actividad=actividad.id
  11. WHERE servicio.nombre IN ('Comunicación', 'Hosting')
  12. GROUP BY empresa.razon_soc

Para el punto dos, partiendo de la del punto uno, puedes hacer una columna que sea COUNT(*) (a parte de la de la razón social) que te indicará el número de veces que aparece esa razón social. Si luego añades un HAVING por el número de apariciones que quieres (una por cada servicio), ya lo tendrás.

Código SQL:
Ver original
  1. SELECT empresa.razon_soc AS Empresa, COUNT(*) AS b
  2. FROM empresa
  3. INNER JOIN emp_serv ON
  4. emp_serv.id_empresa=empresa.id
  5. INNER JOIN emp_act ON
  6. emp_act.id_empresa=empresa.id
  7. INNER JOIN servicio ON
  8. emp_serv.id_servicio=servicio.id
  9. INNER JOIN actividad ON
  10. emp_act.id_actividad=actividad.id
  11. WHERE servicio.nombre IN ('Comunicación', 'Hosting')
  12. GROUP BY empresa.razon_soc
  13. HAVING b > 1
  #3 (permalink)  
Antiguo 16/03/2011, 17:00
 
Fecha de Ingreso: noviembre-2010
Mensajes: 30
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Necesito ayuda con unas consultas que no me salen.

Cita:
Iniciado por Heimish2000 Ver Mensaje
Para el punto uno te basta con hacer un GROUP BY de empresa.razon_soc

Código SQL:
Ver original
  1. SELECT empresa.razon_soc AS Empresa
  2. FROM empresa
  3. INNER JOIN emp_serv ON
  4. emp_serv.id_empresa=empresa.id
  5. INNER JOIN emp_act ON
  6. emp_act.id_empresa=empresa.id
  7. INNER JOIN servicio ON
  8. emp_serv.id_servicio=servicio.id
  9. INNER JOIN actividad ON
  10. emp_act.id_actividad=actividad.id
  11. WHERE servicio.nombre IN ('Comunicación', 'Hosting')
  12. GROUP BY empresa.razon_soc

Para el punto dos, partiendo de la del punto uno, puedes hacer una columna que sea COUNT(*) (a parte de la de la razón social) que te indicará el número de veces que aparece esa razón social. Si luego añades un HAVING por el número de apariciones que quieres (una por cada servicio), ya lo tendrás.

Código SQL:
Ver original
  1. SELECT empresa.razon_soc AS Empresa, COUNT(*) AS b
  2. FROM empresa
  3. INNER JOIN emp_serv ON
  4. emp_serv.id_empresa=empresa.id
  5. INNER JOIN emp_act ON
  6. emp_act.id_empresa=empresa.id
  7. INNER JOIN servicio ON
  8. emp_serv.id_servicio=servicio.id
  9. INNER JOIN actividad ON
  10. emp_act.id_actividad=actividad.id
  11. WHERE servicio.nombre IN ('Comunicación', 'Hosting')
  12. GROUP BY empresa.razon_soc
  13. HAVING b > 1
Funciono todo perfecto, gracias por tu tiempo y por la prolijidad en la explicación.

Etiquetas: Ninguno
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 13:44.