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

INNER JOIN de dos campos de mismo nombre

Estas en el tema de INNER JOIN de dos campos de mismo nombre en el foro de Mysql en Foros del Web. Hola, tengo la siguiente estructura en dos tablas T1 ---------- id id_tutor nombre ..... T2 ----------- id id_tutor nombre ..... e intento hacer un select ...
  #1 (permalink)  
Antiguo 27/02/2012, 19:16
 
Fecha de Ingreso: enero-2010
Mensajes: 389
Antigüedad: 14 años, 3 meses
Puntos: 4
INNER JOIN de dos campos de mismo nombre

Hola,

tengo la siguiente estructura en dos tablas

T1
----------
id
id_tutor
nombre
.....

T2
-----------
id
id_tutor
nombre
.....


e intento hacer un select de todos los datos de cada una, lo estoy haciendo de esta manera:
Código:
SELECT *
FROM T1 p
INNER JOIN T2 a ON p.id_tutor = a.id_tutor
pero si una de las tablas está vacia no me devuelve ningún valor y si ambas tienen me devuelve todo en una misma fila.

Mi pregunta es si se puede hacer para que lo muestre en filas contiguas para trabajar mas facilmente con ellas en PHP y como hacer para que me devuelva los datos aunque alguna de las tablas este vacia, se que se puede, se puede hacer que muestre como NULL las vacias pero no lo recuerdo y por mas que busco no doy con ello

Bueno gracias de antemano y un saludo.
  #2 (permalink)  
Antiguo 27/02/2012, 19:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: INNER JOIN de dos campos de mismo nombre

Cita:
pero si una de las tablas está vacia no me devuelve ningún valor y si ambas tienen me devuelve todo en una misma fila.

Mi pregunta es si se puede hacer para que lo muestre en filas contiguas para trabajar mas facilmente con ellas en PHP y como hacer para que me devuelva los datos aunque alguna de las tablas este vacia, se que se puede, se puede hacer que muestre como NULL las vacias pero no lo recuerdo y por mas que busco no doy con ello
Por lo que dices, necesitas estudiar un poco más de SQL, porque evidentemente no estás entendiendo la función de un JOIN, no digamos ya del INNER JOIN.
El JOIN tiene por objeto relaciona un registro dado de una tabla con uno o más registros de la otra; con ello se implica que siempre devolveráen un mismo registro todos los campos de ambas tablas donde se cumpla la condición del JOIN.
O sea que el que te lo esté devolviendo en un mismo registro es correcto, porque eso es lo que debe hacer.

Por otro lado, el INNER JOIN es la representación de la junta natural, por lo que sólo devuelve aquellos registros de la primera tabla que están efectivamente relacionados con un registro de la segunda. Por ello, el que una de ambas tablas esté vacía hace que no se devuelvan datos. Eso es así por definición, y no es un error.

Ahora bien, lo que tu estás tratando de lograr, según indicas, no es un JOIN sino un UNION, donde se devuelve una agregación de los registros de la primera tabla sumados a los de la segunda. Eso es otra operación completamente diferente y no tiene ning una vinculación con el JOIN.
Un UNION tiene como condición que ambos SELECT deben invocar a la misma cantidad de campos, en el mismo orden y del mismo tipo. Por ello, no puedes usar el asterisco para llamarlos (SELECT *...) a menos que ambas tablas tengan el la misma cantidad de campos, del mismo tipo y en el mismo orden.
Sería:
Código MySQL:
Ver original
  1. SELECT id, id_tutor, nombre
  2. FROM T1 p
  3. SELECT id, id_tutor, nombre
  4. FROM T2 a
Pero ten en cuenta que:
- Un UNION genera un DISTINCT implícito, por lo que no devolverá registros cuyos valores se repitan en forma completa entre ambas tablas.
- Todo ORDER BY o GROUP BY que se aplique al último SELECT afectará a toda la tabla devuelta.
- SI quieres que no elimine duplicados debes usar UNION ALL:

Código MySQL:
Ver original
  1. SELECT id, id_tutor, nombre
  2. FROM T1 p
  3. SELECT id, id_tutor, nombre
  4. FROM T2 a

Como dije, te conviene volver a repasar todos los temas de SQL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 27/02/2012, 20:00
 
Fecha de Ingreso: enero-2010
Mensajes: 389
Antigüedad: 14 años, 3 meses
Puntos: 4
Respuesta: INNER JOIN de dos campos de mismo nombre

gnzsoloyo magnifica explicación, gracias por tus clases de MySQl es justo lo que buscaba

Por cierto hay alguna manera de que me devuelva además el nombre de la tabla de la que procede?

Un saludo
  #4 (permalink)  
Antiguo 27/02/2012, 20:15
 
Fecha de Ingreso: enero-2010
Mensajes: 389
Antigüedad: 14 años, 3 meses
Puntos: 4
Respuesta: INNER JOIN de dos campos de mismo nombre

Debo ordenar las consultas por fecha y dependiendo de la tabla que sea mostrar una u otra opción, podría hacer los dos select de manera independiente y ordenarlos por programación habiendo procesado previamente las opciones extra de cada uno pero lo mucho veo mas laborioso que si ordenase mediante un order by el UNION y simplemente comprobar que tabla es para mostrar cada opción.
  #5 (permalink)  
Antiguo 28/02/2012, 08:57
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: INNER JOIN de dos campos de mismo nombre

Hola erxaca:

Puedes poner un valor constante en cada consulta, para indicar la tabla de la que se están extrayendo los datos:

Código:
SELECT 'tabla1' tabla,  id, id_tutor, nombre
FROM T1 p
UNION ALL
SELECT 'tabla2' tabla, id, id_tutor, nombre
FROM T2 a
La parte de la ordenación no me quedó clara, pero te recuerdo que si pones la cláusula ORDER BY al final de la segunda consulta, la ordenación se realiza sobre el resultado de la union.

Saludos
Leo.
  #6 (permalink)  
Antiguo 28/02/2012, 10:04
 
Fecha de Ingreso: enero-2010
Mensajes: 389
Antigüedad: 14 años, 3 meses
Puntos: 4
Respuesta: INNER JOIN de dos campos de mismo nombre

leonardo_josue mil gracias, es eso lo que buscaba

Para la ordenación no hay problemas :)

Un saludo.

Etiquetas: campos, join, nombre, php, 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 18:14.