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

Ayuda con consulta compleja

Estas en el tema de Ayuda con consulta compleja en el foro de Mysql en Foros del Web. Disculpen que el título del mensaje sea tan poco descriptivo, pero la verdad para mi esta es una consulta compleja. Tengo varias tablas: Cita: publicaciones ...
  #1 (permalink)  
Antiguo 02/12/2009, 12:52
 
Fecha de Ingreso: marzo-2009
Mensajes: 20
Antigüedad: 15 años, 1 mes
Puntos: 0
Ayuda con consulta compleja

Disculpen que el título del mensaje sea tan poco descriptivo, pero la verdad para mi esta es una consulta compleja.

Tengo varias tablas:

Cita:
publicaciones (id, titulo, nota, genero_id, usuario_id, edicion_id, …) hay mas campos pero para ejemplificar sirve.

categorías (id, id_padre, nombre, izq, der, …) hay mas campos pero para ejemplificar sirve.

edicion (id, numero, …) hay mas campos pero para ejemplificar sirve.

relaciones (id_pub, id_cat, tipo, …) hay mas campos pero para ejemplificar sirve.

usuarios (id, nombre, correo, …) hay mas campos pero para ejemplificar sirve.
Las tablas se relación más o menos de la siguiente manera:

Relación 1 a 1
Una noticia solo se asocia a una edición
Una noticia solo se asocia a un usuario
Una noticia solo se asocia a una categoría de forma directa *

Relación 1 a muchas
Una noticia solo se asocia a varias categorías * usando la tabla relaciones para eso.

* La tabla categorías es anidada del tipo árbol que toma en cuenta tanto los id de los padres pero ordena sus hijos según las celdas izquierda y derecha. Así tengo varias categorías agrupadas. Así tengo una categoría padre genero periodísticos que tienen de hijos (noticia, crónica, reseña, articulo, columna y …) tengo otra categoría de secciones por país (Brasil, Colombia, México, Venezuela …) Así puedo asociar una publicación a un único genero periodístico, y usando la tabla relaciones puedo asociar una noticias a varios países. Espero se entienda.

El método de jerarquización usado se explica en la siguiente url en ingles de aquí fue que saque la idea para la estructura de la tabla categorias y por eso la relaciono de diferentes formas con otras tablas: articles.sitepoint.com/article/hierarchical-data-database/2


Tengo la siguiente consulta que me entrega un listado de las publicaciones, relacionandolas perfectamente a los generos, usuarios y ediciones. restingiendo la salida a determina edición.

Código MySQL:
Ver original
  1. p.id AS id,
  2. p.titulo AS tiutlo,
  3. p.nota AS nota,
  4. p.genero_id AS generoid,
  5. p.usuario_id AS usuarioid,
  6. p.edicion_id AS edicionid,
  7. u.id AS uid,
  8. u.nombre AS autor,
  9. u.correo AS correo,
  10. cat.id AS catid,
  11. cat.nombre AS catnombre,
  12. e.id AS edid,
  13. e.numero AS edicion  
  14. FROM publicaciones p INNER JOIN usuarios u ON u.id = p.usuario_id
  15. INNER JOIN categorias cat ON cat.id = p.genero_id
  16. INNER JOIN ediciones e ON e.id = p.edicion_id
  17. WHERE e.numero = ".$edicion."

Ahora lo que yo quisiera es realizar otra consulta donde me mostrara la misma información pero con la restricción adicional de país. Recuerdo aquí que una misma publicación puede asociarse a varios países.

Espero quede clara la información mostrada y la pregunta. Agradezco de antemano su tiempo y conocimiento en mi ayuda.

Última edición por nestoroc; 02/12/2009 a las 13:18
  #2 (permalink)  
Antiguo 02/12/2009, 13:11
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: Ayuda con consulta compleja

El ejemplo está incompleto. Falta la tabla cuyo alias es "n". De esa forma los campos n.usuario_id, n.id_genero y n.edicion no se pueden encontrar.
¿Has omitido algo más?
__________________
¿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 02/12/2009, 13:22
 
Fecha de Ingreso: marzo-2009
Mensajes: 20
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Ayuda con consulta compleja

Cita:
Iniciado por gnzsoloyo Ver Mensaje
El ejemplo está incompleto. Falta la tabla cuyo alias es "n". De esa forma los campos n.usuario_id, n.id_genero y n.edicion no se pueden encontrar.
¿Has omitido algo más?
Perdón no estaba incompleto. Sucedio que modifique el nombre de una tabla y de algunos de sus campos para el ejemplo. ya edite y esta correcto.

Agrego entonces que ese ejemplo funciona bien, yo solo quiero agegar a esta consulta la relación con la otra tabla "relaciones" que es una relacion de una a muchas (una publicación a muchas categorias).

¿Cómo quedaría la nueva consulta, donde se cumpla lo mismo que en la anterior. agregando la condición que se muestren solo las publicaciones asociadas a determinada categoría país?
  #4 (permalink)  
Antiguo 04/12/2009, 18:45
 
Fecha de Ingreso: marzo-2009
Mensajes: 20
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Ayuda con consulta compleja

Tema cerrado.


Sucede que a veces hay que detenerse un poco y pensar en lo realizado.

Pequeños errores y una visión de tunel pueden hacerte perder tiempo de forma increible.

La consulta quedo así:

Código MySQL:
Ver original
  1.    
  2.         n.id AS nid,
  3.         n.titulo AS titulo,
  4.         n.antetitulo AS anteti,
  5.         n.nota_corta AS corta,
  6.         n.nota_larga AS larga,
  7.         n.fecha_publicacion AS nfechap,
  8.         n.fecha_actualizacion AS nfechaa,
  9.         n.fecha_ingreso AS nfechai,
  10.         n.control_editorial AS control,
  11.         n.veces_vista AS vista,
  12.         n.comentarios AS comentario,
  13.         n.veces_comentado AS vc,
  14.         n.usuario_id AS nuid,
  15.         n.foto AS foto,
  16.         n.miniatura AS mini,
  17.         n.leyenda AS leyenda,
  18.         n.genero AS genero,
  19.         n.edicion AS neid,
  20.  
  21.         u.id AS uid,
  22.         u.nombre_usuario AS usuario,
  23.         u.nombre_real AS autor,
  24.         u.clave AS clave,
  25.         u.correo AS correo,
  26.         u.llave AS llave,
  27.         u.grupo_id AS grupo,
  28.         u.fecha_ing AS ufechai,
  29.         u.estado AS uestado,
  30.         u.ultima_ip AS uip,
  31.         u.bio AS bio,
  32.         u.firma AS ufirma,
  33.         u.ultima_fecha AS ufechau,
  34.  
  35.         cat.id AS catid,
  36.         cat.id_padre AS catpadre,
  37.         cat.nombre AS categoria,
  38.         cat.izq AS catizq,
  39.         cat.der AS catder,
  40.         cat.descripcion AS catdes,
  41.         cat.cantidad AS catcant,
  42.         cat.fecha AS catfecha,
  43.  
  44.         e.id AS edi,
  45.         e.numero AS edicion,
  46.         e.descripcion AS edes,
  47.         e.activa AS eact,
  48.         e.portada AS epor,
  49.         e.fecha_creacion AS efechac,
  50.         e.fecha_publicacion AS efechap,
  51.         e.fecha_actualizacion AS efechaa,
  52.  
  53.         r.id_con AS idcont,
  54.         r.id_cat AS idcat,
  55.         r.tipo AS tipo
  56.  
  57.         FROM ".prefijo."noticias n
  58.         INNER JOIN ".prefijo."usuarios u ON n.usuario_id = u.id
  59.         INNER JOIN ".prefijo."categorias cat ON n.genero = cat.id
  60.         INNER JOIN ".prefijo."ediciones e ON n.edicion = e.id
  61.         INNER JOIN ".prefijo."relaciones r ON n.id = r.id_con
  62.         WHERE r.tipo = ".$tipo."
  63.         AND r.id_cat = ".$categoid."
  64.         AND e.numero = ".$edicion."

Gracias por todo esta vez la solución la tenia yo y la consulta no resulta tan compleja.
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 13:34.