Ver Mensaje Individual
  #6 (permalink)  
Antiguo 08/12/2011, 11:04
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 luis_h_1:

Cita:
Iniciado por luis_h_1 Ver Mensaje
Gracias por la ayuda, no utilicé el LEFT JOIN porque aún no me queda muy claro como es que funciona, incluyendo el RIGHT JOIN, he leído algunos tutoriales, pero no me queda claro, seguiré buscando más...
Como he habrás dado cuenta, los JOIN's te sirven para unir dos tablas relacionadas por uno o más campos, la cardinalidad del INNER JOIN es 1 a n, es decir un registro de la tabla A DEBE TENER AL MENOS UN REGISTRO EN LA TABLA B, si no existe este registro entonces NO SE MUESTRA en el resultado final. EL LEFT JOIN tiene una cardinalidad de 1 a 0 o más, es decir, TODOS LOS REGISTROS DE LA TABLA A se muestran, si existen registros en la tabla B que estén relacionados también se muestran, pero SI NO EXISTEN REGISTROS ENTONCES LOS CAMPOS SE PONEN COMO NULL, el RIGHT JOIN es semejante, pero cambia el orden de las tablas, es decir, los SE MUESTRAN TODOS LOS REGISTROS DE LA TABLA B, y solo los registros de la tabla A que se relacionen. 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.00 sec)
  11.  
  12. mysql> SELECT * FROM materia_profesor;
  13. +------------+-------------+
  14. | id_materia | id_profesor |
  15. +------------+-------------+
  16. |          1 |           1 |
  17. |          2 |           1 |
  18. +------------+-------------+
  19. 2 rows in set (0.00 sec)
  20.  
  21. mysql> SELECT * FROM materia M
  22.     -> LEFT JOIN materia_profesor MP
  23.     -> ON MP.id_materia = M.id_materia AND MP.id_profesor = 1;
  24. +------------+----------------+------------+-------------+
  25. | id_materia | nombre_materia | id_materia | id_profesor |
  26. +------------+----------------+------------+-------------+
  27. |          1 | matemáticas    |          1 |           1 |
  28. |          2 | biología       |          2 |           1 |
  29. |          3 | programación   |       NULL |        NULL |
  30. |          4 | química        |       NULL |        NULL |
  31. +------------+----------------+------------+-------------+
  32. 4 rows in set (0.00 sec)


Observa que los id 3 y 4 de la tabla A (materia) NO EXISTEN EN LA TABLA B (materia_profesor), por lo tanto los campos id_materia y id_profesor que corresponden a esta tabla se muestran como NULL para estos registros.

checa ahora el uso del INNER JOIN:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM materia M
  2.     -> INNER JOIN materia_profesor MP
  3.     -> ON MP.id_materia = M.id_materia AND MP.id_profesor = 1;
  4. +------------+----------------+------------+-------------+
  5. | id_materia | nombre_materia | id_materia | id_profesor |
  6. +------------+----------------+------------+-------------+
  7. |          1 | matemáticas    |          1 |           1 |
  8. |          2 | biología       |          2 |           1 |
  9. +------------+----------------+------------+-------------+
  10. 2 rows in set (0.00 sec)

Observa ahora que como los id 3 y 4 de la tabla A NO EXISTEN EN LA TABLA B entonces NO SE MUESTRAN EN EL RESULTADO FINAL

Checa también lo que nos dice WIKIPEDIA acerca de los JOIN's

http://es.wikipedia.org/wiki/Join

En lo particular creo que es bastante clara la explicación que da acerca de cómo se comportan cada uno de los JOIN's. Espero que con esto te quede un poco más claro el funcionamiento de los JOIN's, pues te aseguro que te servirán muchísimo al momento de desarrollar tus consultas.

Saludos
Leo.