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

Problema con consulta (full outer join?)

Estas en el tema de Problema con consulta (full outer join?) en el foro de Mysql en Foros del Web. Hola, estoy intentando esta consulta: SELECT u.nombre,u.apellidos,u.id_usuario,n.fecha,n.tipo,n d.accion , nd.id_deporte, nd.nombre_deporte, na.accion, na.id_actividad FROM usuarios u INNER JOIN noticias n USING (id_usuario) LEFT JOIN noticias_deportes ...
  #1 (permalink)  
Antiguo 26/09/2011, 13:12
 
Fecha de Ingreso: septiembre-2009
Mensajes: 215
Antigüedad: 14 años, 6 meses
Puntos: 1
Problema con consulta (full outer join?)

Hola, estoy intentando esta consulta:

SELECT u.nombre,u.apellidos,u.id_usuario,n.fecha,n.tipo,n d.accion , nd.id_deporte, nd.nombre_deporte, na.accion, na.id_actividad
FROM usuarios u
INNER JOIN noticias n USING (id_usuario)
LEFT JOIN noticias_deportes nd USING (id_noticia)
LEFT JOIN noticias_actividades na USING (id_noticia)
LEFT JOIN noticias_fotos nf USING (id_noticia)
WHERE n.id_usuario = '3'

La idea es que un usuario produce noticias (en este caso el usuario 3) que pueden ser de tipo deportes,actividades o fotos. Cuando la noticia no es de tipo deportes ya no me devuelve lo que quiero...
Creo que lo que necesito es un full outer join pero no sé cómo hacerlo en mysql.

A ver si me podeis echar un cable. Gracias
  #2 (permalink)  
Antiguo 26/09/2011, 13:21
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, 4 meses
Puntos: 2658
Respuesta: Problema con consulta (full outer join?)

El problema es lacadena de dependencias del LEFT JOIN. En los casos en que que hay más de una tabla es conveniente usar el formato compelto ON campo1 = campo2, y no el USING(), porque debe realizarse la relación de cada una de las tablas secundarias con usuario.
Tal y como la pones, están ratando de relacionarse todas con todas, y eso no es posible en el caso que encionas. En otras palabras, están funcionando como un INNER JOIN con un único campo de relación.

Prueba:
Código MySQL:
Ver original
  1.     u.nombre,
  2.     u.apellidos,
  3.     u.id_usuario,
  4.     n.fecha,
  5.     n.tipo,
  6.     nd.accion ,
  7.     nd.id_deporte,
  8.     nd.nombre_deporte,
  9.     na.accion,
  10.     na.id_actividad
  11. FROM usuarios u
  12. INNER JOIN noticias n ON u.id_usuario = nf.id_usuario
  13. LEFT JOIN noticias_deportes nd  ON u.id_usuario = nd.id_usuario
  14. LEFT JOIN noticias_actividades na  ON u.id_usuario = na.id_usuario
  15. LEFT JOIN noticias_fotos nf  ON u.id_usuario = nf.id_usuario
  16. WHERE n.id_usuario = '3'
__________________
¿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 26/09/2011, 13:23
Avatar de Ribon  
Fecha de Ingreso: septiembre-2010
Ubicación: El firmamento
Mensajes: 487
Antigüedad: 13 años, 6 meses
Puntos: 91
Respuesta: Problema con consulta (full outer join?)

Bueno primero, MySQL no soporta FULL OUTER JOIN, lamentablemente, pero si hay maneras de simularlo utilizando UNION por ejemplo.

Código MySQL:
Ver original
  1. SELECT * FROM manzanas a
  2. LEFT JOIN naranjas o ON a.precio=o.precio
  3. SELECT * FROM manzanas a
  4. RIGHT JOIN naranjas o ON a.precio=o.precio

Nota: ese ejemplo lo encontré por ahi xD!
la desventaja de este "simulador" es que tienes que recorrer las tablas 2 veces, lo que lo hace ineficiente =/

Bueno eso fue explicando FULL OUTER JOIN con respecto a tu duda no creo que pueda ser solucionado con esto, más bien es con union xD o un buen rediseño de tu modelo de datos :P

Saludos.
  #4 (permalink)  
Antiguo 26/09/2011, 13:39
 
Fecha de Ingreso: septiembre-2009
Mensajes: 215
Antigüedad: 14 años, 6 meses
Puntos: 1
Respuesta: Problema con consulta (full outer join?)

Cita:
Iniciado por gnzsoloyo Ver Mensaje
El problema es lacadena de dependencias del LEFT JOIN. En los casos en que que hay más de una tabla es conveniente usar el formato compelto ON campo1 = campo2, y no el USING(), porque debe realizarse la relación de cada una de las tablas secundarias con usuario.
Tal y como la pones, están ratando de relacionarse todas con todas, y eso no es posible en el caso que encionas. En otras palabras, están funcionando como un INNER JOIN con un único campo de relación.

Prueba:
Código MySQL:
Ver original
  1.     u.nombre,
  2.     u.apellidos,
  3.     u.id_usuario,
  4.     n.fecha,
  5.     n.tipo,
  6.     nd.accion ,
  7.     nd.id_deporte,
  8.     nd.nombre_deporte,
  9.     na.accion,
  10.     na.id_actividad
  11. FROM usuarios u
  12. INNER JOIN noticias n ON u.id_usuario = nf.id_usuario
  13. LEFT JOIN noticias_deportes nd  ON u.id_usuario = nd.id_usuario
  14. LEFT JOIN noticias_actividades na  ON u.id_usuario = na.id_usuario
  15. LEFT JOIN noticias_fotos nf  ON u.id_usuario = nf.id_usuario
  16. WHERE n.id_usuario = '3'
Esto no funciona, el tema es que yo relaciono primero las noticias con usuarios con id_usuario y luego ese bloque, con todas las noticias se relaciona con id_noticia.
  #5 (permalink)  
Antiguo 26/09/2011, 13:51
Avatar de Ribon  
Fecha de Ingreso: septiembre-2010
Ubicación: El firmamento
Mensajes: 487
Antigüedad: 13 años, 6 meses
Puntos: 91
Respuesta: Problema con consulta (full outer join?)

Con tu modelo la solución que veo (y como te dije denante) es usando UNION de la siguiente manera, no te asustes es por tu modelo de datos jajajaja

Código MySQL:
Ver original
  1. SELECT campos
  2. FROM usuarios u
  3. INNER JOIN noticias n ON u.id_usuario = n.id_usuario
  4. INNER JOIN noticias_deporte nd ON n.id_noticia = nd.id_noticia
  5. WHERE u.id_usuario = 3
  6.  
  7.  
  8. SELECT campos
  9. FROM usuarios u
  10. INNER JOIN noticias n ON u.id_usuario = n.id_usuario
  11. INNER JOIN noticias_actividades na ON n.id_noticia = nd.id_noticia
  12. WHERE u.id_usuario = 3
  13.  
  14.  
  15. SELECT campos
  16. FROM usuarios u
  17. INNER JOIN noticias n ON u.id_usuario = n.id_usuario
  18. INNER JOIN noticias_foto nf ON n.id_noticia = nd.id_noticia
  19. WHERE u.id_usuario = 3

Te recomiendo en la tabla de noticias agregar un campo que identifique el tipo de noticia, por ejemplo que para noticias deporte el id sea 1, para actividades 2 y fotos 3

así la consulta te queda

Código MySQL:
Ver original
  1. SELECT campos
  2. FROM usuarios u
  3. INNER JOIN noticias n ON u.id_usuario = n.id_usuario
  4. u.id_usuario = 3 AND n.tipo_noticia IN (1,2,3);

Así después puedes agregar otros tipos de noticia.

Saludos.
  #6 (permalink)  
Antiguo 26/09/2011, 14:41
 
Fecha de Ingreso: septiembre-2009
Mensajes: 215
Antigüedad: 14 años, 6 meses
Puntos: 1
Respuesta: Problema con consulta (full outer join?)

Cita:
Iniciado por Ribon Ver Mensaje
Con tu modelo la solución que veo (y como te dije denante) es usando UNION de la siguiente manera, no te asustes es por tu modelo de datos jajajaja

Código MySQL:
Ver original
  1. SELECT campos
  2. FROM usuarios u
  3. INNER JOIN noticias n ON u.id_usuario = n.id_usuario
  4. INNER JOIN noticias_deporte nd ON n.id_noticia = nd.id_noticia
  5. WHERE u.id_usuario = 3
  6.  
  7.  
  8. SELECT campos
  9. FROM usuarios u
  10. INNER JOIN noticias n ON u.id_usuario = n.id_usuario
  11. INNER JOIN noticias_actividades na ON n.id_noticia = nd.id_noticia
  12. WHERE u.id_usuario = 3
  13.  
  14.  
  15. SELECT campos
  16. FROM usuarios u
  17. INNER JOIN noticias n ON u.id_usuario = n.id_usuario
  18. INNER JOIN noticias_foto nf ON n.id_noticia = nd.id_noticia
  19. WHERE u.id_usuario = 3

Te recomiendo en la tabla de noticias agregar un campo que identifique el tipo de noticia, por ejemplo que para noticias deporte el id sea 1, para actividades 2 y fotos 3

así la consulta te queda

Código MySQL:
Ver original
  1. SELECT campos
  2. FROM usuarios u
  3. INNER JOIN noticias n ON u.id_usuario = n.id_usuario
  4. u.id_usuario = 3 AND n.tipo_noticia IN (1,2,3);

Así después puedes agregar otros tipos de noticia.

Saludos.
Ya tengo un campo que identifica el tipo de noticia. El problema es que cada tipo de noticia tiene unos campos distintos, por lo tanto, si lo hago como dices tengo que coger primero todas las noticias y luego hacer otra consulta por cada noticia que muestro (para cargar datos de noticias_deportes,noticias_fotos ...etc)

Yo lo estoy intentando hacer así para coger toda la info que necesito con una consulta. ¿es más eficiente de la otra manera?
  #7 (permalink)  
Antiguo 26/09/2011, 14:53
Avatar de Ribon  
Fecha de Ingreso: septiembre-2010
Ubicación: El firmamento
Mensajes: 487
Antigüedad: 13 años, 6 meses
Puntos: 91
Respuesta: Problema con consulta (full outer join?)

Entonces si son noticias con distinta estructura no deberías ponerlas todas en la misma consulta, pues son cosas distintas.
  #8 (permalink)  
Antiguo 26/09/2011, 15:31
 
Fecha de Ingreso: septiembre-2009
Mensajes: 215
Antigüedad: 14 años, 6 meses
Puntos: 1
Respuesta: Problema con consulta (full outer join?)

Pues entonces separaré consultas. Muchas gracias por la ayuda !!

Etiquetas: full, outer, select, sql
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 10:44.