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

Consulta a 3 tablas al mismo tiempo

Estas en el tema de Consulta a 3 tablas al mismo tiempo en el foro de Bases de Datos General en Foros del Web. Hola a todos. Estoy teniendo problemas para realizar una consulta que involucre a 3 tablas al mismo tiempo. Quizá alguien me pueda ayudar, pues pienso ...
  #1 (permalink)  
Antiguo 13/07/2009, 07:37
 
Fecha de Ingreso: marzo-2006
Mensajes: 66
Antigüedad: 18 años, 2 meses
Puntos: 0
Consulta a 3 tablas al mismo tiempo

Hola a todos. Estoy teniendo problemas para realizar una consulta que involucre a 3 tablas al mismo tiempo. Quizá alguien me pueda ayudar, pues pienso que es un problema "de principiante".

Básicamente tengo 3 tablas (muy sencillas), en una almaceno nombres de marcas de vehículos (FORD, NISSAN, FIAT, etc), en otra almaceno los modelos (TSURU, FOCUS, etc.) y en la última almaceno los autos en sí. He aquí la estructura (sólo los campos escenciales):


Código:
TABLA: Marcas
id
nombre

TABLA: Modelos
id 
nombre
marcaid // (el id de la marca, vinculación con la tabla MARCAS)

TABLA: Autos
id
nombre
modeloid // (el id del modelo, vinculación con la tabla MODELOS)

Ahora bien, lo que intento realizar es una consulta que "obtenga los últimos autos añadidos de una marca determinada". Lo más fácil sería realizar una consulta similar a esta:

Código:
SELECT * FROM autos WHERE marcaid=21 order by id desc;
Sin embargo, mi tabla AUTOS no tiene la columna "marcaid", solo tiene vinculación con la tabla MODELOS a través de "modeloid". La tabla MODELOS sí tiene vinculación con la tabla MARCAS a través del camo "marcaid". Por tal razón me puse a investigar e hice una consulta que parecía solucionar los problemas:

Código:
SELECT * FROM autos,modelos,marcas WHERE autos.modeloid = modelos.id AND modelos.marcaid = 21;
Sin embargo, obtengo como resultado TODOS los registros de mi tabla AUTOS. Y nó solo los que pertenecen a cierta marca.

Ese sería mi problema y mi duda. De antemano, muchas gracias.
  #2 (permalink)  
Antiguo 13/07/2009, 07:50
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 3 meses
Puntos: 360
Respuesta: Consulta a 3 tablas al mismo tiempo

Código sql:
Ver original
  1. SELECT a.id,a.nombre auto,mo.nombre modelo, ma.nombre marca
  2. FROM autos a INNER JOIN modelos mo ON a.modeloid=mo.id
  3. INNER JOIN marcas ma ON ma.id=mo.marcaid WHERE mo.marcaid=21;

--EDITO: Me había faltado el where.

no la he probado.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 13/07/2009 a las 08:04
  #3 (permalink)  
Antiguo 13/07/2009, 08:33
 
Fecha de Ingreso: marzo-2006
Mensajes: 66
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: Consulta a 3 tablas al mismo tiempo

Me ha funcionado de maravilla. Muchas gracias huesos52, es grato ver pesonas que te ayudan rápidamente y BIEN.

Aunque no entiendo del todo la sentencia SQL, comprendo la lógica. ¿Sería mucho abuso pedirte que me explicaras el funcionamiento de la sentencia?

Entiendo que primero seleccionas todos los campos que se requieren en la tabla final (id,nombre,modelo y marca), ¿cómo es que te queda una columna con el nombre "auto" si no utilizas "a.nombre AS auto" usando sólamente "a.nombre auto"?

Finalmente, al hacer "INNER JOIN" ¿Por qué se pone "autos a" y no sólo "autos".

Muchas gracias por todo.
  #4 (permalink)  
Antiguo 13/07/2009, 09:02
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 3 meses
Puntos: 360
Respuesta: Consulta a 3 tablas al mismo tiempo

a, ma y mo son alias que se le dan a las tablas para un funcionamiento mas limpio de la consulta.

Es totalmente equivalente a decir
Código sql:
Ver original
  1. SELECT autos.id,autos.nombre auto,modelos.nombre modelo, marcas.nombre marca
  2. FROM autos INNER JOIN modelos ON autos.modeloid=modelos.id
  3. INNER JOIN marcas ON marcas.id=modelos.marcaid WHERE modelos.marcaid=21;

Simplemente, es para utilizar palabras mas cortas para hacer referencia a los campos de las tablas correspondientes.

Cita:
¿cómo es que te queda una columna con el nombre "auto" si no utilizas "a.nombre AS auto" usando sólamente "a.nombre auto"?
La palabra AS es opcional, pero es equivalente en funcionamiento.

Espero haberte ayudado
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 18/07/2009, 12:37
 
Fecha de Ingreso: marzo-2006
Mensajes: 66
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: Consulta a 3 tablas al mismo tiempo

Excelente, muchísimas gracias nuevamente.

Ahora lo que intento hacer es un "MATCH()...AGAINST()" con esas mismas 3 tablas al mismo tiempo. He intentado de todo y no logro que funcione. El código real de mi consulta va así:


SELECT a.*,mo.nombre nombremodelo,ma.nombre nombremarca from autos a INNER JOIN modelos mo ON a.modeloid=mo.id INNER JOIN marcas ma ON mo.marcaid=ma.id WHERE match(a.nombre,mo.nombre) against("escalade");


Recibo el siguiente error: #1210 - Incorrect arguments to MATCH

De antemano, muchas gracias.
  #6 (permalink)  
Antiguo 18/07/2009, 12:47
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 3 meses
Puntos: 360
Respuesta: Consulta a 3 tablas al mismo tiempo

revisa muy bien que el tipo de tabla sea MyISAM, que las columnas a buscar sean fultext y que la versión de mysql te soporte este tipo de consultas.

Un saludo
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 18/07/2009, 12:56
 
Fecha de Ingreso: marzo-2006
Mensajes: 66
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: Consulta a 3 tablas al mismo tiempo

Sí, las 3 tablas son MyISAM y las columnas son FULLTEXT. La versión que tengo de MySQL es la 5.1.33. Según he investigado no es posible realizar una búsqueda FULLTEXT en varias tablas, sin embargo dicen que usando UNION se puede lograr algo simiar :S
  #8 (permalink)  
Antiguo 20/07/2009, 00:22
Avatar de alfcm  
Fecha de Ingreso: mayo-2009
Mensajes: 291
Antigüedad: 15 años
Puntos: 7
Respuesta: Consulta a 3 tablas al mismo tiempo

porque no usas innoDB?
  #9 (permalink)  
Antiguo 21/07/2009, 10:36
barchero
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Consulta a 3 tablas al mismo tiempo

Yo tengo un problema semajante, tengo que hacer una consulta a 3 tablas, pero para ver los multiples resultados, tengo que poner un loop ya que lo estoy programando en php, y mi problema es que al estar un loop dentro de otro, me repite la consulta tantas veces como entradas tengo en la otra tabla.
Aqui les dejo el trozo de codigo responsable:

Código:
$cons= mysql_query("SELECT * FROM tbl_articles INNER JOIN tbl_productes");
while($reo= mysql_fetch_array($cons)){
$check= $reo['id_article'];
$re= $reo['id'];
$respos= $reo['nom'];
$reso= $reo['id'];
if ($check == $re){
$checket = " checked='checked' ";
}else{
$checket ="";
}

echo "<tr><td valign='top' width='444'><input type='checkbox' $checket name=$id2 value=$id2 />$reso;  $respos <br/></tr>";
}
  #10 (permalink)  
Antiguo 24/07/2009, 15:52
 
Fecha de Ingreso: mayo-2009
Mensajes: 1
Antigüedad: 15 años
Puntos: 0
Exclamación AYUDA con estos select en sql

HOLA amigos
Tengo una duda super duda y espero q aca me ayuden!
ia ..tengo una tabla conestas columnas

ID_Obra]
,[ID_Categoria]
******* ,[Tipo_Gasto]****
,[Monto_Ingesado]
,[Fecha_Ingreso]
,[Contador_Ingresos]

y lo q tengo es 3 SP (procedimientos)
1)

select sum(Monto_Ingesado)from Detalle_Gastos where Tipo_Gasto=Gastos Viaticos'
2)

select sum(Monto_Ingesado)from Detalle_Gastos where Tipo_Gasto=astos Compra Materiales'

3)
select sum(Monto_Ingesado)from Detalle_Gastos where Tipo_Gasto='Gastos Movilidad'



como hago para q esos select me muestren solo en una sola consulta y de esta forma
________________________________________________
gastosviaticos | Gastos compra materiales| gastos movilidad|
100 | 200 | 50 |
------------------------------------------------------------------------------


probe con el union pero me salio solo una columna :S con tres filas i eso no kiero :S lo kiero asi como el ejemple ()

Gracias por su tiempo
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 21:08.