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

[SOLUCIONADO] Consulta INNER JOIN extraña para caso atípico

Estas en el tema de Consulta INNER JOIN extraña para caso atípico en el foro de Mysql en Foros del Web. Saludos. Aquí les traigo una consulta que no se como tratar. Tengo 3 tablas: USUARIOS id_usuario nombre .......... VEHICULOS id_vehiculo vehiculo ......... USU_VEHI id_usuario id_vehiculo ...
  #1 (permalink)  
Antiguo 30/01/2012, 08:49
Avatar de cchaparro  
Fecha de Ingreso: febrero-2009
Ubicación: Medellín
Mensajes: 80
Antigüedad: 15 años, 1 mes
Puntos: 2
Consulta INNER JOIN extraña para caso atípico

Saludos.

Aquí les traigo una consulta que no se como tratar.

Tengo 3 tablas:
USUARIOS
id_usuario
nombre
..........

VEHICULOS
id_vehiculo
vehiculo
.........

USU_VEHI
id_usuario
id_vehiculo

Un usuario puede tener varios vehículos, y un vehículo puede pertenecer a varios usuarios, por lo que relaciono con la tabla intermedia USU_VEHI, utilizando los “id” de cada tabla y hacer lo siguiente:

SELECT usuarios.*, vehiculos.* FROM usuarios INNER JOIN usu_vehi ON usuarios.id_usuario = usu_vehi.id_usuario INNER JOIN vehiculos ON vehículos.id_vehiculo = usu_vehi.id_vehiculo WHERE usuarios.id_usuario = '1'

Muestra los datos del usuario con “id = 1”, su nombre y los vehículos que tiene. Hasta aquí todo va bien.

El problema está en que se da la situación de que no todos los usuarios tienen vehículos; en cuanto hago la consulta para obtener solamente los datos de un usuario, así no tenga vehículo, me da resultado vacío, y necesito que me muestre los datos del usuario.

La relación es correcta, pero tiene esa particular situación y no se cómo resolverla; puedo ponerme a realizar las relaciones “a mano” con varias SELECT e ir mirando si tiene o no vehículo, pero esta BD es realmente mayor (apenas puse datos de ejemplo por si me pueden ayudar), y sin utilizar INNER JOIN se hará muy pesado e ineficaz el código, aunque funcione.

En la sintaxis de INNER JOIN no encuentro forma alguna de que en caso de existir una relación que no devuelva resultados, al menos deje los que sí encuentre, por ejemplo:

Si tiene vehículos:
1 - Carlos - Chevrolet
1 - Carlos - Mazda

Si no tiene:
1 - Carlos

Pero que al menos muestre los datos que sí localice; comprendo que si no se cumple la relación completa, no debe dar resultados sino vacío.

Mi pregunta es ¿cómo podría hacer lo que necesito con alguna forma que no quede muy pesada e ineficaz?.

Les agradezco mucho toda la ayuda que me puedan brindar.
  #2 (permalink)  
Antiguo 30/01/2012, 09:18
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta INNER JOIN extraña para caso atípico

Hola cchaparro.

Utiliza LEFT JOIN en lugar de INNER JOIN... ya que este último sirve para relacionar tablas con cardinalidad 1 a 1, es decir que existan registros en ambas tablas a unir. El LEFT JOIN (al igual que el RIGTH JOIN) sirven para unir tablas con cardinalidad 0 a n, es decir que puede haber registros que no existan en ambas tablas, sino sólo en una de ellas.

Checa los ejemplos de santa Wikipedia, son bastante ilustrativos en cuanto al uso de los distintos tipos de join.

http://es.wikipedia.org/wiki/Join

Saludos
Leo.
  #3 (permalink)  
Antiguo 30/01/2012, 09:55
Avatar de cchaparro  
Fecha de Ingreso: febrero-2009
Ubicación: Medellín
Mensajes: 80
Antigüedad: 15 años, 1 mes
Puntos: 2
Respuesta: Consulta INNER JOIN extraña para caso atípico

Hola leonardo.

Asunto solucionado!!!!!!!!!!!!!!!.

Lol, mil gracias por tu respuesta hermano, necesitaba esto y ya estaba empezando a preparar la mente para hacerlo todo mal con SELECT por todas partes "a mano".

Había leído sobre LEFT y RIGHT, pero en la explicación de sintaxis de php.net no lo veía tan claro y ni probé; ya ví en la Wiki la referencia explicativa:

"
El resultado de esta operación siempre contiene todos los registros de la tabla de la izquierda (la primera tabla que se menciona en la consulta), aun cuando no exista un registro correspondiente en la tabla de la derecha, para uno de la izquierda.

La sentencia LEFT OUTER JOIN retorna la pareja de todos los valores de la tabla izquierda con los valores de la tabla de la derecha correspondientes, o retorna un valor nulo NULL en caso de no correspondencia.
"

La verdad es que personalmente no suelo entender mucho si no es con algún ejemplo, aun cuando la teoría lo explica correcta y técnicamente bien.

Supongo que tendré alguna duda más mientras desarrollo el código, pero es bueno saber que contamos con personas que echan una mano.

Lo dicho leonardo, mil gracias y que Dios te bendiga, gracias por tu ayuda tan rápida.

Un saludo y gracias mil de nuevo.
  #4 (permalink)  
Antiguo 30/01/2012, 10:46
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta INNER JOIN extraña para caso atípico

Hola de nuevo... me da gusto ver que resolviste tu problema y que fue de utilidad la información que te dí...

Tal como lo mencionas, seguramente te seguirás enfrentando con problemas mientras desarrollas... pues uno no deja nunca de aprender. Afortunadamente contamos con San Google y Santa Wikipedia que suelen tener la respuesta a muchos de nuestros problemas y por supuesto el foro sigue abierto para cualquier duda.

Suerte en tu desarrollo y que Dios te bendiga a ti también .

Saludos
Leo.
  #5 (permalink)  
Antiguo 30/01/2012, 11:11
Avatar de cchaparro  
Fecha de Ingreso: febrero-2009
Ubicación: Medellín
Mensajes: 80
Antigüedad: 15 años, 1 mes
Puntos: 2
Respuesta: Consulta INNER JOIN extraña para caso atípico

Muchas gracias leonardo sinceramente.

Y sí, San Google y Santa Wiki son lo primero que miro, pero cuando las opciones se me acaban, entonces me toca San Foros del Web :).

Gracias nuevamente por tu ayuda. Gracias a Dios que nos colabora tanto.

Un saludo leonardo. Gracias mil por mil.

Etiquetas: extraña, join, select, tabla
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 16:51.