Ver Mensaje Individual
  #4 (permalink)  
Antiguo 07/12/2011, 16:10
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Consulta a una tabla con relación M:M

Hola de nuevo:

Me alegra mucho que hayas podido encontrar una respuesta por tu propia cuenta... tomo te mencioné en el post, hay varias formas de obtener la misma respuesta... además de NOT IN... checa este script:

Código MySQL:
Ver original
  1. mysql> select * from materia;
  2. +------------+----------------+
  3. | id_materia | nombre_materia |
  4. +------------+----------------+
  5. |          1 | matemáticas    |
  6. |          2 | biología       |
  7. |          3 | programación   |
  8. |          4 | química        |
  9. +------------+----------------+
  10. 4 rows in set (0.01 sec)
  11.  
  12. mysql> select * from profesor;
  13. +-------------+-----------------+
  14. | id_profesor | nombre_profesor |
  15. +-------------+-----------------+
  16. |           1 | josé            |
  17. |           2 | mario           |
  18. +-------------+-----------------+
  19. 2 rows in set (0.02 sec)
  20.  
  21. mysql> select * from materia_profesor;
  22. +------------+-------------+
  23. | id_materia | id_profesor |
  24. +------------+-------------+
  25. |          1 |           1 |
  26. |          2 |           1 |
  27. +------------+-------------+
  28. 6 rows in set (0.00 sec)
  29.  
  30. mysql> #utilizando NOT IN
  31. mysql> SELECT * FROM materia M
  32.     -> WHERE id_materia NOT IN (
  33.     -> SELECT id_materia FROM materia_profesor MP
  34.     -> WHERE MP.id_profesor = 1);
  35. +------------+----------------+
  36. | id_materia | nombre_materia |
  37. +------------+----------------+
  38. |          3 | programación   |
  39. |          4 | química        |
  40. +------------+----------------+
  41. 2 rows in set (0.00 sec)
  42.  
  43. mysql> #utilizando NOT EXISTS
  44. mysql> SELECT * FROM materia M WHERE NOT EXISTS (
  45.     -> SELECT * FROM materia_profesor MP
  46.     -> WHERE MP.id_materia = M.id_materia AND MP.id_profesor = 1);
  47. +------------+----------------+
  48. | id_materia | nombre_materia |
  49. +------------+----------------+
  50. |          3 | programación   |
  51. |          4 | química        |
  52. +------------+----------------+
  53. 2 rows in set (0.00 sec)
  54.  
  55. mysql> #utilizando LEFT JOIN
  56. mysql> SELECT M.* FROM materia M
  57.     -> LEFT JOIN materia_profesor MP
  58.     -> ON MP.id_materia = M.id_materia AND MP.id_profesor = 1
  59.     -> WHERE MP.id_materia IS NULL;
  60. +------------+----------------+
  61. | id_materia | nombre_materia |
  62. +------------+----------------+
  63. |          3 | programación   |
  64. |          4 | química        |
  65. +------------+----------------+
  66. 2 rows in set (0.00 sec)

En lo particular prefiero usar NOT EXISTS en lugar de NOT IN, pues te permite hacer comparaciones con n campos, y no solo con uno, como en el caso de NOT IN... sería conveniente también que revisaras los tiempos de respuesta entre las distintas opciones, para elegir aquella con mejor desempeño.

Saludos
Leo.