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

select multiples tablas con nombre campo repetido

Estas en el tema de select multiples tablas con nombre campo repetido en el foro de Mysql en Foros del Web. Hola, Tengo 3 tablas diferentes en las que todas tienen un campo ID con el mismo valor. Cuando hago: select * from tabla1 tabla2 tabla3 ...
  #1 (permalink)  
Antiguo 07/03/2009, 18:02
 
Fecha de Ingreso: noviembre-2008
Mensajes: 19
Antigüedad: 15 años, 5 meses
Puntos: 0
select multiples tablas con nombre campo repetido

Hola,

Tengo 3 tablas diferentes en las que todas tienen un campo ID con el mismo valor.

Cuando hago:

select * from tabla1 tabla2 tabla3 where ....

la fila row me devuelve los ID de las 3 tablas, hay alguna forma para que solo me devuelva uno?

Gracias
  #2 (permalink)  
Antiguo 08/03/2009, 07:47
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
Respuesta: select multiples tablas con nombre campo repetido

Si lo que quieres decir es que ese campo ID es el que realiza la relación entre las tablas, entonces lo que debes usar es JOIN, o mejor aún, INNER JOIN:
Código sql:
Ver original
  1. SELECT *
  2. FROM tabla1 INNER JOIN tabla2 USING(id) INNER JOIN tabla3 USING(id);

- INNER JOIN hace que la consulta devuelva todos los campos de Tabla1 que coincidan en el o los campos listados en el USING().
- Esta cláusula requiere que los campos comparados tengan el mismo nombre en ambas tablas.
- Si los campos no tienen el mismo nombre, se debe especificar campo por campo de esta forma:
Código sql:
Ver original
  1. SELECT *
  2. FROM tabla1 t1  
  3.     INNER JOIN tabla2 t2 ON t1.id = t2.id
  4.     INNER JOIN tabla3 t3 ON t1.id = t3.id;

- Si deben concidir más de un campo se usa también la cláusula AND:
Código sql:
Ver original
  1. SELECT *
  2. FROM tabla1 t1  
  3.     INNER JOIN tabla2 t2 ON t1.id = t2.id AND t1.campo2 = t2.campo3
  4.     INNER JOIN tabla3 t3 ON t1.id = t3.id;
- Al ejecutar este INNER JOIN los campos cuyos nombres aparecen en el USING sólo aparecerán una vez, no así cuando usas ON. En ese caso aparecerá dos veces.
- La única solución que te queda para evitar la repetición de columnas usando ON es determinando qué columnas aparecerán, y no usando "*". De todos modos te aclaro que se debe evitar usar "SELECT * ..." en todos los casos, ya que es la forma más ineficiente de consulta. Sólo debe invocarse si realmente vas a usar TODOS los datos. SIno estás trayendo "basura" por la red, que en definitiva vas a descartar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 08/03/2009, 18:10
 
Fecha de Ingreso: noviembre-2008
Mensajes: 19
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: select multiples tablas con nombre campo repetido

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
  #4 (permalink)  
Antiguo 08/03/2009, 18:33
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
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)
  #5 (permalink)  
Antiguo 08/03/2009, 19:52
 
Fecha de Ingreso: noviembre-2008
Mensajes: 19
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: select multiples tablas con nombre campo repetido

Gracias otra vez,

La tabla con la que hago pruebas tiene poco registros, tal vez por eso ahora no noto la diferencia.

Inicialmente solo tenia una tabla_A con varios campos tipo text, pero como a veces insertaba mas texto que la capacidad de una fila podia almacenar, dicidi trocear la tabla en tabla_A_1, tabla_A_2, tabla_A_3 por eso tienen el mismo campo ID (todos son primary key). No se si habia mejores alternativas.


Perdona mi ignorancia, pero dada las caracteristicas de mi tabla, si hago por separado:
select * tabla_A1 where id=num
select * tabla_A2 where id=num
select * tabla_A3 where id=num

y luego en php con 'array_merge' uno las 3 rows[], estoy haciendo trabajar mas a mi servidor?


Saludos

Última edición por barbarisa; 08/03/2009 a las 20:10
  #6 (permalink)  
Antiguo 08/03/2009, 21:43
 
Fecha de Ingreso: diciembre-2006
Mensajes: 60
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: select multiples tablas con nombre campo repetido

puedes usar parentesis para crear sub-queries o union select

saludos
  #7 (permalink)  
Antiguo 09/03/2009, 04:58
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
Respuesta: select multiples tablas con nombre campo repetido

Cita:
si hago por separado:
select * tabla_A1 where id=num
select * tabla_A2 where id=num
select * tabla_A3 where id=num

y luego en php con 'array_merge' uno las 3 rows[], estoy haciendo trabajar mas a mi servidor?
En realidad si, porque cada SELECT es un proceso que se ejecuta, y también un conjunto de accesos a disco que conlleva un overhead (tiempo consumido de paso entre procesos) que se va acumulando hasta hacerlo ineficiente.
Lo que en realidad debe tratarse, cuando de consultas se trata, es de reducir la cantidad de accesos a disco que una consulta requiere. Por eso lanzar tres consultas es mas caro en términos de tiempo de procesamiento, que hacer una sola combinada, o como te lo sugiere black_palma, construirlo como subconsultas.

Ten en cuenta que es posible que si lo haces del modo planteado, estés leyendo tres veces el mismo registro, con lo cual puedes estar trayendo tres veces más datos de los necesarios.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 09/03/2009, 13:13
 
Fecha de Ingreso: noviembre-2008
Mensajes: 19
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: select multiples tablas con nombre campo repetido

Hola,

UNION no puedo usarlo porque las tablas tienen diferente numero y nombres de campos.

Parece que esta es la solucion que mas se ajusta:

SELECT * FROM tabla_1 JOIN tabla_2 ON tabla_1.id = tabla_2.id JOIN tabla_3 ON tabla_2.id = tabla_3.id WHERE id = num;

Gracias a todos
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 12:19.