Ver Mensaje Individual
  #4 (permalink)  
Antiguo 30/05/2013, 13:14
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Inner Join no devuelve nada

Hola ferminako:

Tengo algunos problemas para ver la imagen que colocaste en el post, pero creo haber entendido tu problema... en realidad este tipo de ejercicios es uno de los más recurrentes en SQL, hay muchos ejemplos en la red, o en este mismo foro... si te hubieras tomado un poco de tiempo estoy seguro de que habrías encontrado algo similar a lo que requieres, pero bueno, vayamos al grano... te pongo un script, supongamos que tienes las siguientes tablas:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM restaurantes;
  2. +---------+--------------------+
  3. | id_rest | nombre_rest        |
  4. +---------+--------------------+
  5. |       1 | restaurante uno    |
  6. |       2 | restaurante dos    |
  7. |       3 | restaurante tres   |
  8. |       4 | restaurante cuatro |
  9. +---------+--------------------+
  10. 4 rows in set (0.16 sec)
  11.  
  12. mysql> SELECT * FROM servicios;
  13. +---------+---------------+
  14. | id_serv | nombre_serv   |
  15. +---------+---------------+
  16. |       1 | aparcacoches  |
  17. |       2 | guarderia     |
  18. |       3 | otro servicio |
  19. +---------+---------------+
  20. 3 rows in set (0.00 sec)
  21.  
  22. mysql> SELECT * FROM restaurantes_servicios;
  23. +--------------+---------+---------+
  24. | id_rest_serv | id_rest | id_serv |
  25. +--------------+---------+---------+
  26. |            1 |       1 |       1 |
  27. |            2 |       2 |       2 |
  28. |            3 |       3 |       1 |
  29. |            4 |       3 |       2 |
  30. |            5 |       4 |       1 |
  31. |            6 |       4 |       3 |
  32. +--------------+---------+---------+
  33. 6 rows in set (0.00 sec)

Supongo que esto es algo muy parecido a lo que tienes en tus tablas, observa que los restaurantes UNO y DOS tienen alguno de los servicios que tú necesitas, el restaurant TRES tiene ambos, y aunque el restaurante CUATRO tiene dos servicios SÓLO TIENE UNO DE LOS QUE TE INTERESAN. podrías hacer una consulta así:

Código MySQL:
Ver original
  1. mysql> SELECT id_rest, COUNT(DISTINCT id_serv)
  2.     -> FROM restaurantes_servicios WHERE id_serv IN (1, 2)
  3.     -> GROUP BY id_rest;
  4. +---------+-------------------------+
  5. | id_rest | COUNT(DISTINCT id_serv) |
  6. +---------+-------------------------+
  7. |       1 |                       1 |
  8. |       2 |                       1 |
  9. |       3 |                       2 |
  10. |       4 |                       1 |
  11. +---------+-------------------------+
  12. 4 rows in set (0.00 sec)

Observa que esta consulta te da el TOTAL DE SERVICIOS QUE TE INTERESA que tiene cada restaurant... OBSERVA QUE SÓLO EL RESTAURANT TRES tiene ambos servicios... agregando un HAVING COUNT() podrías filtrar aquellos que tengan ambos servicios:

Código MySQL:
Ver original
  1. mysql> SELECT id_rest
  2.     -> FROM restaurantes_servicios WHERE id_serv IN (1, 2)
  3.     -> GROUP BY id_rest
  4.     -> HAVING COUNT(DISTINCT id_serv) = 2;
  5. +---------+
  6. | id_rest |
  7. +---------+
  8. |       3 |
  9. +---------+
  10. 1 row in set (0.00 sec)

Esto es lo que necesitas para filtrar tu información... puedes hacerlo con INNER JOIN's y utilizar subconsultas, o utilizar las funciones IN o EXISTS... eso te lo dejo para tí.

Saludos
Leo.