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

leer 2 tablas y mostrar resultados que cumplan una condicion

Estas en el tema de leer 2 tablas y mostrar resultados que cumplan una condicion en el foro de Mysql en Foros del Web. Hola que tal, llevo dias quebrandome la cabeza y no resuelvo esto, ojala me ayuden con algun ejemplo o algun tutorial. Lo que sucede es ...
  #1 (permalink)  
Antiguo 25/10/2008, 18:43
Avatar de Camarex  
Fecha de Ingreso: enero-2003
Ubicación: Monterrey NL
Mensajes: 148
Antigüedad: 21 años, 9 meses
Puntos: 0
leer 2 tablas y mostrar resultados que cumplan una condicion

Hola que tal, llevo dias quebrandome la cabeza y no resuelvo esto, ojala me ayuden con algun ejemplo o algun tutorial.

Lo que sucede es que tengo 3 tablas en mysql ( usuarios - autos - camionetas )


Y estoy tratando de hacer una consulta que me muestre la lista de autos y camionetas que tenga un usuario en especifico. y el problema es que en el resultado, aparte del usuario que le especifico, me trae los resultados de otro usuario tambien.

Los campos que tiene cada tabla son:

usuarios
-id ( llave primaria )
-usuario
-password
-telefono

autos
-id ( llave primaria)
-usuario
-marca
-modelo

camionetas
-id ( llave primaria )
-usuario
-marca
-modelo

y la consulta que estoy usando es:

Código:
 Select * 
from autos,camionetas,usuarios
where (camionetas.id=autos.id) and (usuarios.usuario="camarex")
El tipo de tablas que uso es InnoDB.

Mi duda es:

Esta bien que los campos id de las tres tablas sean primarias ?
Tiene que hacerse alguna relacion con llaves foraneas ?


De ser asi alguien me puede echar una mano por favor?, Gracias.
__________________
Si el empleo fuera como rentar una casa, entonces no rentes para siempre y busca la manera de Comprar. ;-)
Frase: Edgar Camarena
  #2 (permalink)  
Antiguo 25/10/2008, 21:48
 
Fecha de Ingreso: septiembre-2008
Mensajes: 53
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: leer 2 tablas y mostrar resultados que cumplan una condicion

Si es mucho mejor que tengas una llave foranea y la tabla autos y camiones del id de usario. Pero con lo que tenes podrias hacer esto:

Código:
SELECT a.*, c.*, u.*
FROM (usuarios as u INNER JOIN autos as a ON u.usuario = a.usuario ) Inner join camionetas as c ON u.usuario = c.usuario
WHERE u.usuario = 'El Usuario Que querras';
Chau.
  #3 (permalink)  
Antiguo 25/10/2008, 23:35
Avatar de Camarex  
Fecha de Ingreso: enero-2003
Ubicación: Monterrey NL
Mensajes: 148
Antigüedad: 21 años, 9 meses
Puntos: 0
Respuesta: leer 2 tablas y mostrar resultados que cumplan una condicion

Gracias usuario 1000 , los resultados si se muestran, solo que salen registros repetidos .

ejemplo, con mi user camarex, tengo registrados 2 autos (chevy y Tsuru) y 1 camioneta (blazer)

Entonces en el resultado me arroja :

chevy, tsuru, blazer, blazer....


alguna sugerencia ?
__________________
Si el empleo fuera como rentar una casa, entonces no rentes para siempre y busca la manera de Comprar. ;-)
Frase: Edgar Camarena
  #4 (permalink)  
Antiguo 26/10/2008, 01:14
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: leer 2 tablas y mostrar resultados que cumplan una condicion

Creo que tienes una estructura inadecuada. Lo que yo haría sería esto:
usuarios
-idusuario ( Primary Key)
-usuario
-password
-telefono

vehiculos
-idvehiculo (Primary Key)
-usuario
-marca
-modelo
-tipo

vehiculosusuarios
-idvehiculosusuarios ( Primary Key)
-idvehiculo (Foreign Key)
-idusuario (Foreign Key)


Las relaciones debes establecerlas por los id de las tablas (Primary Key) y las Foreign Key, idvehiculo e idusuario, de la tabla vehiculosusuarios, que serán campos de tipo int y estarán indexadas.
Para asignar a un usuario dos vehículos o más. Introducirías dos o más registros en la tabla vehiculosusuarios con el idusuario correspondiente al id de ese usuario.
En el campo tipo de vehículo distinguiría si se trata de un auto o una camioneta.
Luego sería muy fácil encontrar cualquier cosa.
Creo que eso es lo mejor.
Respecto a lo que tienes, te diré que podrías sacar lo que quieres con una union como esta:

(SELECT u.usuario, a.marca as marca, a.modelo as modelo, 'auto' from usuarios u inner join autos a on u.usuario = a.usuario where u.usuario = 'Periquito')
union distinct
(SELECT u.usuario, c.marca as marca, c.modelo as modelo, 'camioneta' from usuarios u inner join camionetas c on u.usuario = c.usuario where u.usuario = 'Periquito')

Pero esto es "pan para hoy y hambre para mañana". Vuelve a pensar en la estructura: ese es mi consejo, Camarex.

Última edición por jurena; 27/10/2008 a las 01:46
  #5 (permalink)  
Antiguo 26/10/2008, 18:47
Avatar de Camarex  
Fecha de Ingreso: enero-2003
Ubicación: Monterrey NL
Mensajes: 148
Antigüedad: 21 años, 9 meses
Puntos: 0
Respuesta: leer 2 tablas y mostrar resultados que cumplan una condicion

Gracias jurena, el codigo me marcaba unknown field u , asi que mejor puse los nombres de las tablas completos y funciono, almenos en My SQL Manager... falta echarlo a andar en la pagina web que estoy armando en mi localhost.

sobre poner los diferentes vehiculos en una tabla, no estoy muy seguro aun si sera lo mejor o no, ya que a futuro se agregaran muchas mas categorias, y creo que al tener todas en una tabla, haria la consulta muy tardada. ( a no ser que me equivoque )

y con el ejemplo que me sugeriste, veo que son 2 select , ya que son 2 tablas, entonces cuando tenga unas 30 categorias (30 tablas) tendria que poner 30 selects tambien.

Es por eso que me entra en duda si seguir con este procedimiento o declarar llaves foraneas. Solo que en el tema de llaves foraneas no estoy muy familiarizado.

Alguna sugerencia o manual en español ? , mil gracias.
__________________
Si el empleo fuera como rentar una casa, entonces no rentes para siempre y busca la manera de Comprar. ;-)
Frase: Edgar Camarena
  #6 (permalink)  
Antiguo 27/10/2008, 01:53
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: leer 2 tablas y mostrar resultados que cumplan una condicion

Camarex,
perdona los errores al no asignar los alias y tratar de utilizarlos. Ya lo he corregido en el post.
En cuanto a tu decisión de seguir por esa vía, creo que te equivocas. Te diré que si creas una tabla tipos, donde aparezcan los 30 tipos, con su id, y en la tabla de cruce pones un refidtipo numérico, y lo indexas este último, y creas una tabla marcas con su id y su refmarca en la tabla de vehículos, indexado también, todo eso junto con lo que te dije en mi anterior post, estoy seguro de que no habrá retraso. Creo que eso es lo mejor. Con tu estructura, tendrás que abrir varias consultas, hasta 30 con union all, por no hablarte de los problemas que tendrás cuando trates de hacer estadísticas, y eso cuando la mayor parte de las consultas las harás sobre el total de los datos y no sobre camionetas, autos o los tipos que pongas.
Imagina que tienes que buscar el porcentaje de vehículos de determinada cilindrada o precio que se vendieron durante los meses x. Díme cómo lo harías. Te pongo este ejemplo, aunque soy consciente de que necesitarías una tabla venta con el id del comprador, ref. del vehículo y fechas. Pero piensa sobre lo que tendrías que hacer con 30 tablas separadas... ¡Ah! no sé por qué esos temores sobre el rendimiento de la base: no sé de cuántos registros podemos estar hablando.


Suerte

Última edición por jurena; 27/10/2008 a las 07:03
  #7 (permalink)  
Antiguo 28/10/2008, 18:20
Avatar de Camarex  
Fecha de Ingreso: enero-2003
Ubicación: Monterrey NL
Mensajes: 148
Antigüedad: 21 años, 9 meses
Puntos: 0
Respuesta: leer 2 tablas y mostrar resultados que cumplan una condicion

jaja, en realidad no tengo tantos registros , pero pensando positivamente en que el sitio crezca, quiero estar preparado.

La consulta que deje para mostrar todos los vehiculos ( autos, camionetas y motos ) pertenencientes a un usuario en particular, quedo de la siguiente manera: (por si a alguien mas le sirve)


Código PHP:
    $consultamysql_query("
    (SELECT autos.marca, autos.modelo, autos.datos from usuarios inner join autos on usuarios.usuario = autos.usuario where usuarios.usuario = '$user')
    union distinct
    (SELECT camionetas.marca, camionetas.modelo, camionetas.datos from usuarios inner join camionetas on usuarios.usuario = camionetas.usuario where usuarios.usuario = '$user')
    union distinct
    (SELECT motos.marca, motos.modelo, motos.datos from usuarios inner join motos on usuarios.usuario = motos.usuario where usuarios.usuario = '$user') ORDER BY modelo
    "
,$con); 
Funciona excelente.

Ahora bien, al tener categorias diferentes, (digamos unas 30) seria mejor utilizar llaves foraneas para un mejor rendimiento de la base de datos ?

De ser asi, alguien sabe donde hay informacion en español sobre como utilizar las llaves foraneas ? .... mil gracias
__________________
Si el empleo fuera como rentar una casa, entonces no rentes para siempre y busca la manera de Comprar. ;-)
Frase: Edgar Camarena
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:45.