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

Inner Join

Estas en el tema de Inner Join en el foro de Mysql en Foros del Web. Hola a todos. Soy un poco novatillo en esto del mysql y estaba preparando un formulario de búsqueda de registros. Estoy un poco desesperadillo ya ...
  #1 (permalink)  
Antiguo 26/11/2007, 04:55
 
Fecha de Ingreso: noviembre-2007
Mensajes: 7
Antigüedad: 16 años, 5 meses
Puntos: 0
Inner Join

Hola a todos. Soy un poco novatillo en esto del mysql y estaba preparando un formulario de búsqueda de registros. Estoy un poco desesperadillo ya que he googleado un poco pero no hay manera de resolverlo. Pregunto a los maestros a ver si alguien me dice donde me equivoco.

Resulta que tengo una tabla principal con campos id_xxxx que se refieren a un número. Este número se relaciona en otra tabla con un nombre. Lo que yo queria es hacer una consulta en la que en lugar del número se escribiera el nombre (ubicado en otra tabla).

Código:
SELECT assignatures.assignatura
FROM assignatures      INNER JOIN principal         ON assignatures.id_assignatura = principal.id_assignatura
WHERE principal.id_professor = colname AND principal.avaluacio = colname2
Esta consulta me funciona bien. Pero cuando intento poner otro inner join dentro para enlazar otro campo me da error 1066 not unique table/alias
Código:
SELECT 
	departaments.departament, professors.professor, 
	assignatures.assignatura, grups.grup, cursos.curs, 
	nivells.nivell, principal.avaluacio, principal.n_aprovats, principal.n_suspesos, 
	principal.tpc_aprovats, principal.tpc_aprovats_previst, principal.rao_no_tpc_aprovats, 
	principal.c_rebudes, principal.c_no_rebudes, principal.tpc_c_rebudes, principal.tpc_c_rebudes_previst, 
	principal.rao_no_tpc_c_rebudes, principal.u_previstes, principal.u_impartides, 
	principal.rao_no_u_impartides, principal.millora
FROM    assignatures INNER JOIN principal ON assignatures.id_assignatura = principal.id_assignatura,
	departaments INNER JOIN principal ON departaments.id_departament = principal.id_departament,
	grups INNER JOIN principal ON grups.id_grup = principal.id_grup,
	cursos INNER JOIN principal ON cursos.id_curs = principal.id_grup,
	professors INNER JOIN principal on professors.id_professor = principal.id_professor,
	nivells INNER JOIN principal on nivells.id_nivell = principal.id_nivell,
	principal
WHERE principal.id_professor = colname AND principal.avaluacio = colname2

SELECT assignatures.assignatura
FROM assignatures      INNER JOIN principal         ON assignatures.id_assignatura = principal.id_assignatura
WHERE principal.id_professor = colname AND principal.avaluacio = colname2
Lo único que necesito es convertir el id_loquesea en el correspondiente nombre para todos los campos. Qué estoy haciendo mal?
  #2 (permalink)  
Antiguo 27/11/2007, 22:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Re: Inner Join

Bueno, te falta un poco de álgebra relacional.
Los INNER JOIN son excelentes formas de reunir y seleccionar conjuntos de registros entre dos tablas que comparten un campo. Pero hacer un INNER JOIN encadenado entre varias tablas, es un tanto ineficiente, ya que la selecciones se superponen en un cálculo que al motor del SGBD le puede insumir ingentes cantidades de tiempo de procesador... inutilmente.

Para usar un INNER JOIN hay algunas reglas básicas:

1. Se debe realizar sobre tablas acotadas por selecciones previas, esto es, ten en cuenta que lo primero que se intentará hacer es el INNER JOIN, por lo que se hará con TODOS los registros disponibles, incluso los que al final no se usarán. Es mejor realizar un select previo. Los INNER JOIN siempre deben ser la etapa final de las consultas.

2. Dos inner join encadenados se deben realizar por medio de subconsultas, sobre todo para prevenir el cruzamiento de alias (que es lo que te está diciendo el MySQL: estás haciendo dos inner join con una tabla que se comparte entre ambos y sin otorgarle un alias a la segunda). O sea: SELECT X,Y,Z FROM TABLA1 INNER JOIN (SELECT K,J,Z FROM TABLA2 INNER JOIN TABLA3 ON TABLA2.K = TABLA3.K) AS TABLA4 ON TABLA2.Z = TABLA4.Z; De esta forma los encadenamientos de las tabla sderivadas y sus resultados son más claros.

3. Índices declarados sobre los campos compartidos, aceleran el resultado.

4. Si existen índices que contengan toda la información buscada de una tabla (como el de los nombres+apellidos+id_documento), MySQL hará el nner join leyendo el ídice y no la tabla.

5. El uso de subconsultas y alias en tablas y campos permite, dado el caso, que si el nombre del campo de una tabla es diferente del campo relacionado en otra tabla, se puede hacer que al derivarla la tabla resultado tenga los el mismo nombre que el del siguiqnte INNER JOIN y por tanto poder usar el USING.
Además: Si los campos que se comparten de dos tablas tienen el mismo nombre, la sintaxis más eficiente no es usar ON sino USING: SELECT K,J,Z FROM TABLA2 INNER JOIN TABLA3 USING (K); en MySQL es más rápido.

Última edición por gnzsoloyo; 27/11/2007 a las 22:12 Razón: Visualización del texto y claridad de conceptos
  #3 (permalink)  
Antiguo 01/12/2007, 18:05
 
Fecha de Ingreso: noviembre-2007
Mensajes: 7
Antigüedad: 16 años, 5 meses
Puntos: 0
Re: Inner Join

La verdad es que tienes razón. Me falta algo de álgebra relacional.

Gracias por tu ayuda.
  #4 (permalink)  
Antiguo 03/12/2007, 05:35
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Re: Inner Join

Fijate si puedes conseguir, si no lo has leído ya, al menos las primeras partes del libro de Kort: Fundamentos de bases de Datos, (es un poco tedioso, pero bastante bien explicado), donde el trema de las consultas múltiples está bastante bien explicado.

Además de eso, fijate bien en el tema SUBCONSULTAS en el manual del MySQL, porque MySQL tiene algunas diferencias con el estándar de SQL que son muy útiles.

Otra sugerencia que a mí me sirvió bastante es buscar en Google los temas de Optimización de Consultas en MySQL. Hay mucho y muy útil.

Saludos.

Última edición por gnzsoloyo; 03/12/2007 a las 05:55
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 23:16.