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

leer registros

Estas en el tema de leer registros en el foro de Mysql en Foros del Web. Hola, Tengo una consulta con join, la cuestión es que dos tablas tienen columnas con el mismo nombre pero datos distintos y cuando no se ...
  #1 (permalink)  
Antiguo 02/01/2009, 09:45
 
Fecha de Ingreso: noviembre-2005
Mensajes: 182
Antigüedad: 18 años, 5 meses
Puntos: 4
leer registros

Hola,

Tengo una consulta con join, la cuestión es que dos tablas tienen columnas con el mismo nombre pero datos distintos y cuando no se cumple la condición del left loin y llena con NULL la segunda tabla me coge el valor NULL y no el otro que si tiene un valor válido.

Como puedo hacer para leer los datos de una u otra tabla, voy a poner un ejemplo que seguro que no me he explicado.

Código:
$query="SELECT * FROM articulos
INNER JOIN autor ON articulos.autor_id = autor.autor_id
LEFT JOIN tema ON articulos.tematica = tema.tematica
WHERE  articulos.id=500";

$result = mysql_query($query);
$row=mysql_fetch_array($result);
Es posible que el LEFT JOIN no se cumpla y rellene con NULL los campos de la tabla tema y entonces artículos tenga campos con valor que coinciden en nombre con los que tiene tema.

Lo que quiero hacer es leer los campos según la tabla, no se, por ejemplo de la forma $row['nombre_tabla.nombre_campo'], como puedo hacer esto?, no tendré que cambiar el nombre de las columnas.

Es posible hacer que un LEFT JOIN en lugar de llenar los campos con NULL no incluya ningun campo? que sólo los incluya si se cumple la condición.

Muchas gracias
  #2 (permalink)  
Antiguo 02/01/2009, 10:19
Avatar de Avatar810  
Fecha de Ingreso: agosto-2007
Ubicación: Por rumbos Regios
Mensajes: 485
Antigüedad: 16 años, 8 meses
Puntos: 23
Respuesta: leer registros

Creo que no es posible hacer que no ponga la coluna si no tiene valor.

El detalle aqui es justamente que los 2 campos se llaman igual.

Solucion: en el select no uses * sino selecciona cada uno de los campos que necesitas (incluyendo la tabla) y asignales un alias

$query="SELECT ar.id as art_id, ar.nombre as art_nombre, ar.fecha as art_fecha, au.id as aut_id, au.nombre as aut_nombre, te.id as tem_id, te.nombre as tem_nombre FROM articulos AS ar
INNER JOIN autor AS au ON ar.autor_id = au.autor_id
LEFT JOIN tema AS te ON ar.tematica = te.tematica
WHERE ar.id=500";
__________________
Una demo siempre funcionará correctamente hasta que toque algo tu (hasta ahora) cliente.
Avatar810
  #3 (permalink)  
Antiguo 02/01/2009, 10:26
 
Fecha de Ingreso: noviembre-2005
Mensajes: 182
Antigüedad: 18 años, 5 meses
Puntos: 4
Respuesta: leer registros

Eso lo había pensado pero me puedo morir escribiendo y si sólo fuera una consulta, no es posible poner alias a los join y que cargue esos campos con un prefijo o algo así?
  #4 (permalink)  
Antiguo 02/01/2009, 10:34
Avatar de Avatar810  
Fecha de Ingreso: agosto-2007
Ubicación: Por rumbos Regios
Mensajes: 485
Antigüedad: 16 años, 8 meses
Puntos: 23
Respuesta: leer registros

realmente la asignacion de alias es indispensable exlusivamente para los campos que se duplican, pero por buenas practicas es poco conveniente usar * es mejor indicar exactamente que campos son los que necesitas

se vale SELECT ar.*, au.*, te.llave, te.tema as Duplicado, te. otro_campo FROM .........

osea seleccionar todo (*) de las tablas que no tienen dumplicados y despues seleccionar los campos de la tabla que si dumplica y asignarle alias solo al campo con el mismo nombre
__________________
Una demo siempre funcionará correctamente hasta que toque algo tu (hasta ahora) cliente.
Avatar810
  #5 (permalink)  
Antiguo 02/01/2009, 14:37
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: leer registros

El problema, tal y como lo estás planteando en el primer post, es que lo que intentas hacer no tiene sentido con respecto al JOIN en cualquiera de sus formas.
Empecemos desde el principio en una forma sintética:

Cita:
1. El JOIN realiza el cruce de una tabla T1 con otra tabla T2 en función de ciertos comportamientos que dependen de los valores de cada tabla.

2. Un JOIN simple sin discriminación cruza cada registro de una tabla con cada registro de la otra devolviendo una tabla que es el resultado de combinar cada registro de T! con cada uno de T2, sin importar si los valores coinciden o no.

3. El INNER JOIN realiza la junta de cada registro de una con cada registro de la otra en función de un campo determinado, el cual puede tener el mismo nombre en ambas tablas o tener diferentes nombres en cada tabla. En cualquier caso solamente devolverá aquellos en los que el campo coincida en su valor.

4. LEFT JOIN o RIGHT JOIN funcionan de la misma forma: Uno devuelve los registros de la tabla IZQUIERDA que coincidan con el cruce, la otra los de la DERECHA. Pero en cualquier caso debe existir una cláusula ON con los campos que se comparan.

5. En cualquier caso, si la consulta entre T1 y T2 no produce resultados en la clausula ON o los campos no contienen ningún valor ni tipo de columna idénticos, MySQL devolverá NULL.

6. En una consulta donde existan valores idénticos en algunos registros relacionados, devolverá esos registros, no devolviendo ningún otro.
Sabiendo esto, al menos, entonces podemos deducir que si tenemos 3 tablas T1, T2 y T3, la consulta dará resultado si y sólo si toda la vinculación devuelve en cada caso un valor no nulo. Esto es, si la tabla T1 cruzada con la tabla T2 devuelve algún resultado, entonces habrá datos sobre los que hacer la cruza con la tabla T3. Si no devuelve datos entre T1 y T2, sería lo mismo que estár haciendo un JOIN entre T3 y NULL... lo que por definición es NULL.

¿Se comprende la idea?

En esencia, lo que sucede es que los JOIN funcionan en forma lógica como un AND de lógica proposicional: Solamente es verdadero cuando ambos son verdaderos...

Nunca olvidar que a nivel algebraico, NULL es un valor de anulación o elemento nulo. Todo elemento sumado, encadenado, multiplicado,dividido o vinculado a un campo NULL es NULL.
Y una consulta que da NULL es una consulta que no devuelve ninguna tabla.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 02/01/2009, 16:44
 
Fecha de Ingreso: noviembre-2005
Mensajes: 182
Antigüedad: 18 años, 5 meses
Puntos: 4
Respuesta: leer registros

Hola gnzsoloyo,

Gracias por tu respuesta.

Entiendo lo que dices, la cuestión era realizar una sóla consulta en lugar de varias para sacar los datos de las tablas.

Esto viene por una estructura antigua en la que son coincidentes el nombre de algunas columnas, pero ya veo que no es posible lo que buscaba.

Muchas gracias y un saludo
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 14:20.