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

Dudas con LEFT JOIN

Estas en el tema de Dudas con LEFT JOIN en el foro de Bases de Datos General en Foros del Web. Hola. Tengo una duda sobre los left join, creía entenderlo bien, pero algo pasa porque no me sale una estúpida consulta. Tengo una tabla, atributos, ...
  #1 (permalink)  
Antiguo 05/02/2010, 07:55
 
Fecha de Ingreso: diciembre-2009
Mensajes: 40
Antigüedad: 15 años
Puntos: 0
Dudas con LEFT JOIN

Hola.

Tengo una duda sobre los left join, creía entenderlo bien, pero algo pasa porque no me sale una estúpida consulta.

Tengo una tabla, atributos, donde tengo dados de alta todos los atributos que uso para configurar la privacidad de los datos de un usuario.
Tengo una segunda tabla, privacidad, donde se insertan los campos que ya he configurado de mi privacidad. Los que aún no he configurado no se muestran.

Lo que quiero es realizar una consulta que me muestre todos los campos de la tabla atributos y también los que estén relacionados con los de la tabla privacidad. Pero siempre debe mostrarme los de la tabla atributos y si no tiene relación con la tabla privacidad, que me muestre NULL.

Yo entiendo que la consulta es la siguiente:
Código SQL:
Ver original
  1. SELECT p.nombre, a.id_atributo
  2. FROM atributos a LEFT JOIN privacidad p ON a.id_atributo = p.id_atributo

Pero nada, me devuelve solo los que están relacionados, como si se tratara de una join normal.

El resultado sería algo así:
p.Nombre a.id_atributo
Juan--------1
Juan--------2
Manolo-----1
NULL -------2 --> Este registro no me lo duevelve y es lo que yo querría que me devolviera.

Alguna idea?
  #2 (permalink)  
Antiguo 05/02/2010, 10:20
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: Dudas con LEFT JOIN

Código MySQL:
Ver original
  1. SELECT p.nombre, a.id_atributo
  2. FROM atributos a LEFT JOIN privacidad p ON a.id_atributo = p.id_atributo
  3. WHERE p.nombre AND p.nombre IS 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)
  #3 (permalink)  
Antiguo 08/02/2010, 02:21
 
Fecha de Ingreso: diciembre-2009
Mensajes: 40
Antigüedad: 15 años
Puntos: 0
Respuesta: Dudas con LEFT JOIN

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Código MySQL:
Ver original
  1. SELECT p.nombre, a.id_atributo
  2. FROM atributos a LEFT JOIN privacidad p ON a.id_atributo = p.id_atributo
  3. WHERE p.nombre AND p.nombre IS NULL;
Pues a mi esto no me funciona, entiendo que el AND debería ser un OR, ya que es imposible que se cumpla que nombre tenga y no tenga valor al mismo tiempo.

Pongo el código de creación de las tablas y la consulta que realizo a ver si así alguien puede echarme una mano.

Código SQL:
Ver original
  1. CREATE TABLE `atributos` (
  2.     `id_atributo` INT(10) NOT NULL AUTO_INCREMENT,
  3.     `nombre` VARCHAR(50) NOT NULL,
  4.     `columna` VARCHAR(50) NOT NULL,
  5.     PRIMARY KEY (`id_atributo`)
  6. )
  7. ENGINE=InnoDB
  8. ROW_FORMAT=DEFAULT
  9. AUTO_INCREMENT=3
  10.  
  11. CREATE TABLE `privacidad` (
  12.     `id_usuario` INT(10) NOT NULL,
  13.     `id_atributo` INT(10) NOT NULL,
  14.     `privacidad` TINYINT(3) NOT NULL,
  15.     PRIMARY KEY (`id_usuario`, `id_atributo`),
  16.     INDEX `fk_Privacidad_Atritubos` (`id_atributo`),
  17.     INDEX `fk_Privacidad_usuarios1` (`id_atributo`),
  18.     CONSTRAINT `fk_Privacidad_usuarios1` FOREIGN KEY (`id_atributo`) REFERENCES `usuarios` (`id_usuario`) ON UPDATE NO ACTION ON DELETE NO ACTION,
  19.     CONSTRAINT `fk_Privacidad_Atritubos` FOREIGN KEY (`id_atributo`) REFERENCES `atributos` (`id_atributo`) ON UPDATE NO ACTION ON DELETE NO ACTION
  20. )
  21. ENGINE=InnoDB
  22. ROW_FORMAT=DEFAULT
  23.  
  24. SELECT *
  25. FROM atributos a LEFT JOIN privacidad p ON a.id_atributo = p.id_atributo

Atributos tiene solo dos registros.
id_atributo: 1 nombre: Nombre columna: nombre
id_atributo: 2 nombre: Apellidos columna: apellidos

Privacidad tiene 3 registros
id:usuario: 1 id_atributo: 1 privacidad 3
id:usuario: 1 id_atributo: 2 privacidad 3
id:usuario: 38 id_atributo: 2 privacidad 3

El resultado que devuelve es el siguiente:

"id_atributo";"nombre";"columna";"id_usuario";"id_ atributo";"privacidad"
"1";"Nombre";"nombre";"1";"1";"3"
"1";"Nombre";"nombre";"38";"1";"3"
"2";"Apellidos";"apellidos";"1";"2";"3"

Yo quiero que me devuelva para el id_usuario 38 todos los registros de atributos que no tienen conexión.

Es posible esto o estoy yo muy equivocado?

Gracias.
  #4 (permalink)  
Antiguo 08/02/2010, 03:11
 
Fecha de Ingreso: diciembre-2009
Mensajes: 40
Antigüedad: 15 años
Puntos: 0
Respuesta: Dudas con LEFT JOIN

Hola de nuevo.

He conseguido lo que buscaba, pero no se si de una manera un tanto rebuscada...

La consulta resultante es la siguiente:
Código SQL:
Ver original
  1. SELECT * FROM ((SELECT a.id_atributo, a.nombre, a.columna, p.id_usuario, p.privacidad FROM atributos a LEFT JOIN privacidad p
  2. ON a.id_atributo = p.id_atributo
  3. WHERE a.id_atributo NOT IN (SELECT p.id_atributo FROM privacidad p WHERE p.id_usuario = 38))
  4. UNION
  5. (
  6. SELECT a.id_atributo, a.nombre, a.columna, p.id_usuario, p.privacidad FROM atributos a,privacidad p WHERE p.id_usuario = 38 AND a.id_atributo = p.id_atributo
  7. )) AS consulta
  8. ORDER BY consulta.id_atributo

Y estos los resultados:

"id_atributo";"nombre";"columna";"id_usuario";"pri vacidad"
"1";"Nombre";"nombre";"38";"3"
"2";"Apellidos";"apellidos";"1";"3"
"3";"Fecha de Nacimiento";"fecha_nacimiento";NULL;NULL
"4";"Sexo";"sexo";NULL;NULL
"5";"Ciudad";"ciudad";NULL;NULL


Los datos que a mi me interesan son siempre los del usuario 38, como me está devolviendo datos de otro usuario, desde mi código PHP tendré que comprobar siempre si el dato que me devuelve es de ese usuario y si no hacer otra cosa.

Lo ideal hubiera sido que me devolviera los datos con una simple consulta, pero entiendo que no es posible.

Si alguien sabe como hacerlo que me lo diga, ya que esta consulta es un tanto complicada de mantener en un futuro.

Etiquetas: join, left
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 02:43.