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

Duda al hacer NATURAL LEFT JOIN

Estas en el tema de Duda al hacer NATURAL LEFT JOIN en el foro de Bases de Datos General en Foros del Web. tengo una tabla A con 4 campos, y otra tabla B con 2 campos el primer campo de ambas tablas es el mismo, pongamosle 'id' ...
  #1 (permalink)  
Antiguo 18/06/2009, 23:24
 
Fecha de Ingreso: mayo-2009
Mensajes: 210
Antigüedad: 15 años, 6 meses
Puntos: 0
Duda al hacer NATURAL LEFT JOIN

tengo una tabla A con 4 campos, y otra tabla B con 2 campos

el primer campo de ambas tablas es el mismo, pongamosle 'id'

pero la tabla B no tiene una fila para cada fila de A. B tiene menos filas que A.

al hacer:

| SELECT a.id, [..] b.user FROM a NATURAL LEFT JOIN b ORDER BY id DESC;

me sale la tabla que yo quiero, pero donde no habia una coincidencia de A en B, me deja el campo 'b.user' vacío. Hay forma de indicarle que llene ese campo con algun default? Por ejemplo 'no tiene usuario' ? O me conviene hacerlo desde afuera de alguna otra forma, con PHP por ejemplo?
  #2 (permalink)  
Antiguo 19/06/2009, 00:15
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: Duda al hacer NATURAL LEFT JOIN

horape,
¿Qué base de datos usas?
si es MySQL, puedes usar IFNULL(campo,'valor por defecto') o COALESCE(campo,'valor por defecto').
Creo que COALESCE es más estándar y te funcionará en algún otro gestor. Se lo añades a los campos de la tabla que en el cruce se queda a la derecha, porque son los que pueden mostrarse como nulos en ese cruce.
SELECT COALESCE(campo,'valor por defecto') dato FROM tu_tabla NATURAL LEFT JOIN...
  #3 (permalink)  
Antiguo 19/06/2009, 02:50
 
Fecha de Ingreso: mayo-2009
Mensajes: 210
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Duda al hacer NATURAL LEFT JOIN

uso mysql

pero entonces como quedaría?

| SELECT a.id, [..] IFNULL(b.user,'unknown') FROM a NATURAL LEFT JOIN b ORDER
| BY id DESC;

asi puede ser??

estuve probando y no me anda, tmb probe con COALESCE y con REPLACE

cuando pongo eso salen todos los user en blanco, incluso los que sí coinciden.
  #4 (permalink)  
Antiguo 19/06/2009, 09:57
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: Duda al hacer NATURAL LEFT JOIN

SELECT a.id, [..] IFNULL(b.user,'unknown') FROM a NATURAL LEFT JOIN b ON a.nombrecampo = b.nombrecampo ORDER BY id DESC;

Te falta el campo de cada tabla por el que haces la unión. Pon los nombres de tabla delante de cada campo, por eje. order by a.id... si tienes dos campos que se llamen id, uno en cada tabla.
Ah, y olvídate de replace para esto.
  #5 (permalink)  
Antiguo 19/06/2009, 16:15
Avatar de gildus  
Fecha de Ingreso: agosto-2003
Mensajes: 1.495
Antigüedad: 21 años, 3 meses
Puntos: 105
Respuesta: Duda al hacer NATURAL LEFT JOIN

Holas,

Solo aumentale al final de tu consulta un:

Cita:
.... WHERE Not Null(el_campo_que_te_sale_vacio_o_nulo)
Saludos
Gildus
__________________
.: Gildus :.
  #6 (permalink)  
Antiguo 19/06/2009, 18:28
 
Fecha de Ingreso: mayo-2009
Mensajes: 210
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Duda al hacer NATURAL LEFT JOIN

Cita:
Iniciado por jurena Ver Mensaje
SELECT a.id, [..] IFNULL(b.user,'unknown') FROM a NATURAL LEFT JOIN b ON a.nombrecampo = b.nombrecampo ORDER BY id DESC;

Te falta el campo de cada tabla por el que haces la unión. Pon los nombres de tabla delante de cada campo, por eje. order by a.id... si tienes dos campos que se llamen id, uno en cada tabla.
Ah, y olvídate de replace para esto.
no se supone q el NATURAL JOIN una todos los campos del mismo nombre? para q el ON? Igual probe y no anda, si saco el ON si anda, pero siguen quedando campos vacios

Cita:
Iniciado por gildus Ver Mensaje
Holas,

Solo aumentale al final de tu consulta un:

.... WHERE Not Null(el_campo_que_te_sale_vacio_o_nulo)

Saludos
Gildus
Pero eso lo que haria seria no mostrar las filas que tengan un campo vacio, y lo que yo quiero es que las muestre pero rellenando con 'unknown'







tambien probe con IF(b.user = '','unknown',b.user)
y con IF(b.user = NULL,'unknown',b.user)

en ambos casos me deja todo en blanco

AYUDA POR FAVOOOOR =(

pd: sino muevanme el tema a mysql

Última edición por horape; 19/06/2009 a las 18:40
  #7 (permalink)  
Antiguo 20/06/2009, 00:54
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: Duda al hacer NATURAL LEFT JOIN

SELECT a.id, [..] IFNULL(b.user,'unknown') FROM a LEFT JOIN b ON a.nombrecampo = b.nombrecampo ORDER BY id DESC;

A ver, Left join une poniendo todos los registros de la tabla a a la izquierda y los de la tabla b a la derecha, y los une poniendo en relación el campo por el que tú unas ambas tablas. Por ejemplo, en la tabla a pareces tener los usuarios; todos los user de a serán presentados, y cuando no tengan un registro relacionado con él en la tabla b aparecerán como nulos, con la etiqueta unknown si usas ifnull en los campos de la tabla b.
Pero explícanos un poco la naturaleza de los datos, y qué quieres conseguir exactamente.
  #8 (permalink)  
Antiguo 20/06/2009, 06:38
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Duda al hacer NATURAL LEFT JOIN

Citando al manual de referencia:
Cita:
El NATURAL [LEFT] JOIN de dos tablas se define semánticamente equivalente a un INNER JOIN o LEFT JOIN con una cláusula USING que nombra todas las columnas que existen en ambas tablas.
Esto significa que en realidad NATURAL LEFT JOIN existe por compatibilidad. Lo realmente funcional es INNER JOIN o LEFT JOIN.
En cualquiera de los dos casos se puede usar ON o USING para establecer los campos de enlace, pero con esta salvedad: USING requiere que los campos tengan el mismo nombre en ambas tablas, mientras que ON se puede usar en ese caso, o en el caso que los campos implicados tengan diferente nombre.
LEFT JOIN (y su contraparte RIGHT JOIN) opera con los campos devueltos de la primera tabla (a la izquierda de la sentencia), pero tanto uno como otro pueden devolver valoes en NULL, con lo que se debe considerar el problema. De allí lo de NOT NULL. El detalle es que la sintaxis sería en todo caso
Código sql:
Ver original
  1. campo IS NOT NULL
Puesto que no existe una función NULL como para escribir: Not Null(el_campo_que_te_sale_vacio_o_nulo).

LEF JOIN es la más funcional si lo que quieres es que coincidan las cosas con la primera tabla, o bien, si en este JOIN pueden necesitarse recuperar valores de la primera tabla aunque no haya correspondencias con la segunda. En ese caso, en esos campos se usa IFNULL(,) para evitar que en el campo aparezca en NULL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 20/06/2009, 17:07
 
Fecha de Ingreso: mayo-2009
Mensajes: 210
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Duda al hacer NATURAL LEFT JOIN

listo tenian razon, ya me anda (lo probe directo desde el mysql).. pero por algun motivo cuando hago ese cambio en mi programa en PHP sale en blanco sin tirar erro, lo preguntaré en el otro foro

gracias
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 23:22.