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

Busqueda a tres bandas en una sola consulta

Estas en el tema de Busqueda a tres bandas en una sola consulta en el foro de Bases de Datos General en Foros del Web. Hola a todos! Tengo un pequeño problema con 3 tablas. He estado saturando un poco la base de datos de los foros (perdona Christian) buscando ...
  #1 (permalink)  
Antiguo 02/08/2005, 06:15
Avatar de KarlanKas
Moderador extraterrestre
 
Fecha de Ingreso: diciembre-2001
Ubicación: Madrid
Mensajes: 6.987
Antigüedad: 22 años, 4 meses
Puntos: 61
Busqueda a tres bandas en una sola consulta

Hola a todos!

Tengo un pequeño problema con 3 tablas. He estado saturando un poco la base de datos de los foros (perdona Christian) buscando hilos que trataran sobre esto, y no he encontrado nada parecido (creo que es porque no he sabido como preguntarlo).


Tengo 3 tablas: una llamada personas que contiene diversos datos personales de distintos seres bípedos, otra llamada proyectos que contiene datos técnicos y una tercera llamada rel_personas_y_proyectos cuyos registros son de 3 campos: persona, proyecto y relación. En cada registro se pone el personas.id, el proyectos.id y la relación (en el campo relación) que tienen entre sí.

El problema surge cuando tengo que poner una lista de todos los proyectos conteniendo datos de la tabla proyectos y de la tabla personas del registro de la persona que interviene en dicho proyecto como promotor (es un tipo de relación en la tabla de relacion_personas_y_proyectos).

Los datos que tendría que sacar serian: ubicacion y expediente de la tabla proyectos y nombre y apellidos del promotor de la tabla de personas.

Me gustaría hacerlo en una sola consulta. ¿Sería posible? He hecho cosas parecidas con dos tablas, pero no con tres...

Por ahora tengo:

SELECT id,expediente,ubicacion FROM personas ORDER BY expediente

y luego por cada resultado hago

SELECT persona FROM rel_personas_y_proyectos WHERE relacion="promotor" AND proyecto=$resultado['id']

Siendo $resultado['id'] el campo id de la tabla personas que toque en ese momento. Y siendo persona el campo de la tabla rel_personas_y_proyectos en la que se hace referencia al id del registro de la tabla personas donde se guardan los datos de la persona en cuestión.

Y luego ya saco los datos de la tabla personas:

SELECT nombre,apellidos FROM personas WHERE id=$resultado2['persona']

Como veis es un montón de consultas. Seguro que hay una forma, pero soy muy pez en esto. Me podeis ayudar?

P.D.- Para ayudar a entenderme he puesto los nombres de los campos de las tablas en color azul y el nombre de las tablas en rojo.
__________________
Cómo escribir

No hay pregunta tonta, sino tonto que quiere seguir en la ignorancia.
  #2 (permalink)  
Antiguo 02/08/2005, 07:33
Avatar de Punktruka  
Fecha de Ingreso: enero-2005
Ubicación: Santiago, Chile
Mensajes: 215
Antigüedad: 19 años, 3 meses
Puntos: 0
Hola, podrias hacer todo eso en un procedimiento almacenado y se demorará menos si tiene ke axeder a varias tablas..
kon respekto a las uniones...si se puede unir varias tablas a la vez..
mira ste kodigo en sql.... es algo ke yo he hexo y no me dio problema

Código:
select denuncio.cod_item, denuncio.sub_ramo,
'96.594.270-K' as rut_vio, cias.rut as rut_cia, denuncio.num_siniestro,
denuncio.num_poliza_afectada, denuncio.item, denuncio.f_sini, denuncio.fecha_denuncio, convert(char(10),
convert (datetime,denuncio.f_ingreso,103),105) as f_ingreso, usr.nombre,
valor.v_t as moneda,cast(denuncio.perdida_t as decimal(18,4)) as perdida_t,
cast(denuncio.perdida_t_a as decimal(18,4)) as perdida_t_p , denuncio.cod_estado, bitacora.cod_accion, bitacora.cod_item, bitacora.cod_bita, bitacora.descripcion, 
convert(char(10),convert(datetime,bitacora.fecha,103),105) as fecha, bitacora.hora, bitacora.tipo, bitacora.archivo
from denuncio INNER JOIN cias ON denuncio.compania_aseguradora = convert(varchar(100),cias.cod_cia)
INNER JOIN valor ON denuncio.cod_item = valor.cod_item and cod_campo = 2912 INNER JOIN bitacora ON denuncio.cod_item = bitacora.cod_item
INNER JOIN usr ON denuncio.analista = usr.usr
where ((denuncio.cod_estado <> '1000') OR (denuncio.cod_estado = '1000' 
and denuncio.cod_item in(select cod_item 
from bitacora 
where cod_accion = 19 
and convert(char(10),convert(datetime,bitacora.fecha,103),103) = '08/03/2002')))
order by denuncio.cod_item,bitacora.cod_bita
bueno alomejor te pareserá komplikado el kódigo pero kise kolokar ste para ke veas ke tb se pueden inkorporar varias funciones a la vez en las konsultas..
eso si.. algunas funciones deben kambiar porke al pareser tu stas trabajando kon MySql y yo kon SQL SERVER
ojala te haya servido de algo.
by
__________________
y nada más
porke el cielo ya está de nuevo torvo y sin estrellas kon helikópteros y SIN DIOS....
  #3 (permalink)  
Antiguo 02/08/2005, 07:36
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 20 años, 6 meses
Puntos: 11
Lo que quieres hacer se llama Join, estúdialo en la documentación del gestor de bases de datos que usas (que no indicas).
  #4 (permalink)  
Antiguo 02/08/2005, 07:38
Avatar de KarlanKas
Moderador extraterrestre
 
Fecha de Ingreso: diciembre-2001
Ubicación: Madrid
Mensajes: 6.987
Antigüedad: 22 años, 4 meses
Puntos: 61
Es MySQL... He usado el JOIN con 2 tablas, pero nunca con tres... lo miraré.

Gracias!

Y gracias a tí, Punktruka! Estoy estudiando tu propuesta con verdadero interés!
__________________
Cómo escribir

No hay pregunta tonta, sino tonto que quiere seguir en la ignorancia.
  #5 (permalink)  
Antiguo 02/08/2005, 09:08
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 20 años, 6 meses
Puntos: 11
Es igual, ninguna diferencia, la preocupacion de siempre, que haya una clave para juntar.
  #6 (permalink)  
Antiguo 02/08/2005, 09:23
Avatar de Punktruka  
Fecha de Ingreso: enero-2005
Ubicación: Santiago, Chile
Mensajes: 215
Antigüedad: 19 años, 3 meses
Puntos: 0
si ok. pero no es necesario ke sea llaves, porke kon las tablas ke en este momento stoy trabajando no tienen llaves(por error antiguo de diseño) pero aún así las puedo unir gracias a ke los kampos se repiten en ambas tablas..
imagina el rekorrido ke debo hacer..jajajaj..!!!!
bueno, tb me salva el outer join por si el valor del kampo no se enkuentra
bueno. esto...es solo un aporte...
by
__________________
y nada más
porke el cielo ya está de nuevo torvo y sin estrellas kon helikópteros y SIN DIOS....
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:18.