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

Select con varias tablas

Estas en el tema de Select con varias tablas en el foro de Mysql en Foros del Web. Necesito generar una consulta de varias tablas, pero como lo estoy haciendo me duplica los registros de la tabla principal. Estoy utilizando esta sentencia: Select ...
  #1 (permalink)  
Antiguo 15/02/2006, 14:13
 
Fecha de Ingreso: agosto-2005
Mensajes: 9
Antigüedad: 19 años, 3 meses
Puntos: 0
Select con varias tablas

Necesito generar una consulta de varias tablas, pero como lo estoy haciendo me duplica los registros de la tabla principal.

Estoy utilizando esta sentencia:

Select t1.id, t1.nombre, t2.id, t2.fecha, t3.id, t3.plazo
from t1 left join t2 on t1.id = t2.id
left join t3 on t1.id = t3.id

Necesito que se muestren todos los registros de la tabla T1 y sus correspondientes equivalencias en las otras tablas, pero cuando en otra(s) tabla(s) existe mas de un id igual al id de T1 me duplica los registros de T1.

No se si me hice entender. Como no se me permite enviar vinculos externos lo escribo a continuacion, alli hay un ejemplo de lo que esta sucediendo.

espanol punto geocities punto com eslash tocolito slash select punto gif

Mi duda es: Es posible generar la consulta sin que se dupliquen los registros ? que codigo utilizo.

Gracias.
  #2 (permalink)  
Antiguo 15/02/2006, 14:18
Avatar de Linterns
Colaborador
 
Fecha de Ingreso: diciembre-2001
Mensajes: 2.799
Antigüedad: 22 años, 11 meses
Puntos: 11
si se te estan duplicandobasta con que pongas la palabra DISTINTC dentro del select


Select distintc t1.id, t1.nombre, t2.id, t2.fecha, t3.id, t3.plazo
from t1 left join t2 on t1.id = t2.id
left join t3 on t1.id = t3.id
__________________
Bien se puede recibir una puñalada sin adulación,
pero rara vez se recibe una adulación sin puñalada
** ***
  #3 (permalink)  
Antiguo 16/02/2006, 06:39
 
Fecha de Ingreso: agosto-2005
Mensajes: 9
Antigüedad: 19 años, 3 meses
Puntos: 0
Select con varias tablas

Gracias por responder a mi inquietud.

ejecute la sentencia q me indica y no funciono, sigue duplicando los registros de la tabla principal.
  #4 (permalink)  
Antiguo 16/02/2006, 08:29
Avatar de deadlykyo  
Fecha de Ingreso: noviembre-2005
Ubicación: Cbba - Bolivia
Mensajes: 747
Antigüedad: 19 años
Puntos: 5
por que no pones la estructura de tus tablas para ver como estan tus joins , y tambien si muestras mas o menos en que sentido te duplica los datos (toda una fila completa, o solo algunas columnas), tal vez con un ejemplo nos quede mas claro, cya
__________________
"El Conocimiento es de todos, no solo de algunos"
  #5 (permalink)  
Antiguo 16/02/2006, 09:30
 
Fecha de Ingreso: agosto-2005
Mensajes: 9
Antigüedad: 19 años, 3 meses
Puntos: 0
Inconveniente en select

La estructura de las tablas y el ejemplo de la consulta lo puede ver en:

http dos puntos / / espanol punto geocities punto com / tocolito / select punto gif
  #6 (permalink)  
Antiguo 16/02/2006, 10:03
Avatar de deadlykyo  
Fecha de Ingreso: noviembre-2005
Ubicación: Cbba - Bolivia
Mensajes: 747
Antigüedad: 19 años
Puntos: 5
Me parece que el problema no es de tu consulta, por que te muestra filas distintas no te esta repitiendo ninguna, segun lo que me muestras, ahora suponiendo que quieres ver uno solo de jose (segun tu ejemplo), deberias tal vez pensar en agruparlo con GROUP BY y poner una condicion para ver de que fecha quieres y que plazo, si no siempre te mostrara mas de una fila, aqui te dejo una idea de com podria ser:
Código PHP:
//
SELECT t1.idt1.nombret2.idt2.fechat3.idt3.plazo
FROM t1 left join t2 on t1
.id t2.id
left join t3 on t1
.id t3.id 
WHERE t2
.fecha=MAX(t2.fecha)
GROUP BY t1.id
// 


tal vez no seria mala idea revisar tu modelo, y ver si esta normalizada tus tablas, cya
__________________
"El Conocimiento es de todos, no solo de algunos"
  #7 (permalink)  
Antiguo 16/02/2006, 10:04
Avatar de Linterns
Colaborador
 
Fecha de Ingreso: diciembre-2001
Mensajes: 2.799
Antigüedad: 22 años, 11 meses
Puntos: 11
si te fijas bien... el problema es que elplazo te esta variando por lo que las tuplas son diferentes.... si tu no extraes el plazo te muestra sin repetir.

Ahora si tu quieres mostrar el plazo por ejemplo de Jose en la fecha 2006-02-02 que plazo quieres que te muestre????

puedes intentar agrupar (suponiendo que quieres el maximo plazo):

Select t1.id, t1.nombre, t2.id, t2.fecha, Max(t3.plazo)
from t1 left join t2 on t1.id = t2.id
left join t3 on t1.id = t3.id
Groupby t1.id, t1.nombre, t2.id, t2.fecha
__________________
Bien se puede recibir una puñalada sin adulación,
pero rara vez se recibe una adulación sin puñalada
** ***
  #8 (permalink)  
Antiguo 16/02/2006, 10:52
 
Fecha de Ingreso: agosto-2005
Mensajes: 9
Antigüedad: 19 años, 3 meses
Puntos: 0
Disculpen tanta insistencia, tal vez no me he hecho entender.

La Bd q estoy trabajando es para registrar el proceso total d un contrato (modo de inicio, firmas, contratista, interventor, adicionales, modificaciones, resoluciones, etc).

En la tabla pricipal capturo datos basicos del contrato (registro) y en las demas tablas los datos complementarios del registro. Un registro de la tabla principal (llamemoslo id = 1) puede presentar los siugientes casos:
1) Tener un solo registro (id = 1) en todas las otras tablas.
2) Tener un solo registro (id = 1) en algunas tablas.
3) Tener varios registros (id = 1) en una o mas tablas (Ej. un adicional en plazo y uno en valor; dos adicionales en valor y uno en plazo, varias resoluciones; varias modificaciones, etc).

La consulta q necesito es q me liste TODOS los registros de la tabla principal y si encuentra id iguales en las otras tablas me los liste tambien TODOS, de lo contrario esa parte del registro saldria vacia.

Lo q no he podido hacer es evitar q se dupliquen los registros de la tabla principal cuando encuentra varios id iguales en otra(s) tabla(s).

La imagen citada anteriormente es un ejemplo de muestra, mas no es la BD q estoy trabajando, pero hay se puede apreciar lo q esta sucediendo.
  #9 (permalink)  
Antiguo 23/02/2006, 12:59
 
Fecha de Ingreso: agosto-2005
Mensajes: 9
Antigüedad: 19 años, 3 meses
Puntos: 0
Sigo sin poder resolver mi problema, alguien me podria ayudar por favor. O si es que en definitiva no se puede hacer para no insistir mas.

Gracias.
  #10 (permalink)  
Antiguo 23/02/2006, 13:13
Avatar de deadlykyo  
Fecha de Ingreso: noviembre-2005
Ubicación: Cbba - Bolivia
Mensajes: 747
Antigüedad: 19 años
Puntos: 5
Lo que pasa es que tu consulta no te esta duplicando resultados (duplicar es que tengas filas completamente iguales iguales), ahora te pregunte si querias que se viera un solo jose (como en el ejemplo) deberias pensar en agruparlos, pero no dijiste nada sobre el asunto, ahora la idea es si quieres agruparlos por fecha (la primera fecha, o la ultima talvez ) o si quieres agruparlos por el plazo , bueno tu ya diras como quieres que sea esta consulta, cya
__________________
"El Conocimiento es de todos, no solo de algunos"
  #11 (permalink)  
Antiguo 24/02/2006, 06:51
 
Fecha de Ingreso: agosto-2005
Mensajes: 9
Antigüedad: 19 años, 3 meses
Puntos: 0
En verdad si, necesito que la conculta me reporte una vez el nombre JOSE y sus tres registros correspondientes de T2 y los 2 registros de T3, al igual q los demas registros de T1. No necesito agruparlos por fechas.

Necesito es q me liste TODOS los registros de la tabla principal y si encuentra id iguales en las otras tablas me los liste tambien TODOS, de lo contrario esa parte del registro saldria vacia, pero que no me duplique los nombres (Ej., JOSE) de la tabla principal.

No se si me hice entender.

Gracias.
  #12 (permalink)  
Antiguo 04/10/2010, 12:59
 
Fecha de Ingreso: septiembre-2010
Mensajes: 27
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Select con varias tablas

Cita:
Iniciado por deadlykyo Ver Mensaje
Me parece que el problema no es de tu consulta, por que te muestra filas distintas no te esta repitiendo ninguna, segun lo que me muestras, ahora suponiendo que quieres ver uno solo de jose (segun tu ejemplo), deberias tal vez pensar en agruparlo con GROUP BY y poner una condicion para ver de que fecha quieres y que plazo, si no siempre te mostrara mas de una fila, aqui te dejo una idea de com podria ser:
Código PHP:
//
SELECT t1.idt1.nombret2.idt2.fechat3.idt3.plazo
FROM t1 left join t2 on t1
.id t2.id
left join t3 on t1
.id t3.id 
WHERE t2
.fecha=MAX(t2.fecha)
GROUP BY t1.id
// 


tal vez no seria mala idea revisar tu modelo, y ver si esta normalizada tus tablas, cya
Muchas gracias me sirvio bastante ese ejemplo
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 13:47.