Ver Mensaje Individual
  #4 (permalink)  
Antiguo 08/03/2009, 18:33
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, 2 meses
Puntos: 2658
Respuesta: select multiples tablas con nombre campo repetido

Cita:
Iniciado por barbarisa Ver Mensaje
Gracias Gnzsoloyo por la respuesta.

Efectivamente el campo ID solo me aparece una vez.

Estoy haciendo pruebas y parece que la siguiente ejecucion mysql es mas rapida que con INNER JOIN ... USING... a pesar de que me devuelve la $row[] con los 3 ID del mismo valor:

select * from tabla_1, tabla_2, tabla_3 where tabla_1.id=$num and tabla_2.id=$num and tabla_3.id=$num

Saludos
Si, es posible, aunque el uso de la coma (",") es un sinónimo de JOIN, por lo cual debería funcionar igual si la escribes:
Código sql:
Ver original
  1. SELECT  *  
  2. FROM tabla_1 JOIN tabla_2 JOIN tabla_3
  3. WHERE tabla_1.id=num AND tabla_2.id=num AND tabla_3.id=num ]

Pero la cosa adolece de algunos problemas:
1. Requiere que solamente sean iguales los nombres de los campos con el mismo tipo de dato. En otras palabras, si en las Tabla1, Tabla2 y Tabla3 existe un campo "ID" los igualará. Pero si la relación de Tabla1.ID es con Tabla2.IdTabla1, no lo hará. Esa vinculación se hace con el ON solamente. Además, si existen otros campos, por ejemplo "nombre", en las tablas y que no están estrictamente vinculados, a MySQL no le importará, los tratará de igualar de todos modos.
Para que se entienda el problema: Supongamos que exista una tabla USUARIOS(ID,NOMBRE) y otra DEPARTAMENTO_USUARIO(ID,NOMBRE,ID_USUARIO), donde DEPARTAMENTO_USUARIO.NOMBRE es el nombre del departamento. Se puede hacer sin problema:
Código sql:
Ver original
  1. SELECT *
  2. FROM USUARIO, DEPARTAMENTO_USUARIO;
Pero esa consulta te devolverá los usuarios que tengan el mismo ID que el departamento y se llamen igual que el departamento... lo que no tiene sentido.
Como forma de consulta es rápida, pero eso no significa que sea correcta o lógica.

2. Poner la condición de igualación en el WHERE es muy ineficiente, porque el parser de MySQL no puede optimizar el WHERE y si puede hacerlo con el FROM. Por eso se recomienda hacer un
Código sql:
Ver original
  1. SELECT  *  
  2. FROM tabla_1 JOIN tabla_2 ON tabla_1.id = tabla_2.id JOIN tabla_3 ON tabla_2.id = tabla_3.id
y no la forma que estás usando. Si lo que quieres después es restringir a un sólo ID, bien puedes hacer
Código sql:
Ver original
  1. SELECT  *  
  2. FROM tabla_1 JOIN tabla_2 ON tabla_1.id = tabla_2.id JOIN tabla_3 ON tabla_2.id = tabla_3.id
  3. WHERE id = num;
Eso te dará mejores resultados.

3. El JOIN (o su sinónimo, la coma) pueden ser rápidos cuando se trata de pocas tablas y pocos registros, pero como se trata de una junta natural, produce en definitiva un producto cartesiano, lo que si cruzas tres tablas de 1.000 registros, implica procesar 1000.000.000 de registros en memoria. Por eso existe en INNER JOIN: Sólo procesa los puntos de coincidencia y no lee el resto de los registros; en cambio el JOIN lee todo, combina y recién entonces selecciona...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)