Ver Mensaje Individual
  #5 (permalink)  
Antiguo 15/07/2012, 10:15
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: 17 años, 1 mes
Puntos: 2658
Respuesta: Consulta SQL - JOIN - A Y U D A !!!

En términos generales, la consulta que planteas esta mas o menos correcta. Hay algunas cosas que se pueden mejorar, pero que no afectan a la lógica de la consulta:

- No uses coma, si usas JOIN, LEFT JOIN, INNER JOIN o RIGHT JOIN. Pueden producirse errores de interpretación en el parser en ocasiones. A veces incluso saltan errores de sintaxis que no son tales, porque si hay un JOIN de cualquier tpo, la coma genera problemas.

- Pon las tablas en el orden de la cadena de relaciones. Hace más eficiente la lectura de los datos.

- Si usas relaciones de FK, nunca uses MyISAM, las tablas MyISAM no tienen restricciones de FK, por lo que deberás mantener la consistencia de forma programática. Las tablas MyISAM son eficientes sólo si hay muchas operaciones INSERT/UPDATE/DELETE. Y por muchas, estamos hablando de cientos de miles por día, para que quede claro.

- Usa alias abreviados. Poner alias largos es un despropósito, no ayuda a la comprensión del código.

- Los filtros de valores en el FROM (A = N siendo N una constante), no son eficientes si no hay indices definidos para esos campos. En ese caso suele ser mejor ponerlos en el WHERE.

Limpiando un poco el código, queda mas o menos así (es basicamente lo que pusiste):
Código MySQL:
Ver original
  1.     E.id,
  2.     E.apellido1,
  3.     E.apellido2,
  4.     E.nombre1,
  5.     E.nombre2,
  6.     AR.id,
  7.     AR.descripcion,
  8.     A.descripcion,
  9.     A.id,
  10.     N.*
  11.     personas E
  12.     INNER JOIN matriculas M             ON E.id = M.persona_id
  13.     INNER JOIN grupos G                 ON G.id = M.grupo_id
  14.     INNER JOIN asignaturas_grados AG    ON G.id = AG.grado_id
  15.     INNER JOIN asignaturas A            ON A.id = AG.asignatura_id
  16.     INNER JOIN areas AR                 ON A.id = A.area_id
  17.     LEFT JOIN notas N                   ON E.id = N.estudiante_id
  18.     N.periodo_id = 4
  19.     AND AG.grado_id = 9
  20.     AND G.id = 32
  21.     E.apellido1,
  22.     E.apellido2,
  23.     E.nombre1,
  24.     E.nombre2;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)