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

Consulta a 3 tablas

Estas en el tema de Consulta a 3 tablas en el foro de Mysql en Foros del Web. Buenas. Ojala podáis ayudarme con esto porque la verdad es que se me está quedando muy grande esto de las consultas a varias tablas y ...
  #1 (permalink)  
Antiguo 06/07/2011, 06:20
 
Fecha de Ingreso: marzo-2004
Mensajes: 283
Antigüedad: 20 años, 1 mes
Puntos: 2
Consulta a 3 tablas

Buenas.

Ojala podáis ayudarme con esto porque la verdad es que se me está quedando muy grande esto de las consultas a varias tablas y me estoy volviendo loco. Tengo un sistema de noticias que se publican en varias webs y lo que intento relacionar 3 tablas que son las siguientes:

'noticias': Almacena la id de la noticia y el título y el texto de la misma (entre muchas más cosas)
'webs_relaciones': Relaciona cada web con una o varias noticias o imagenes
'tags_relaciones': Relaciona cada etiqueta (tag) con una o varias noticias o imagenes

Os pongo un ejemplo para que sea más sencillo de entender:

noticias
Código:
id_noticia | titulo | texto
-------------------------------
1 | 'titulo 1' | 'texto noticia 1'
2 | 'titulo 2' | 'texto noticia 2'
3 | 'titulo 3' | 'texto noticia 3'
4 | 'titulo 4' | 'texto noticia 4'
webs_relaciones
Código:
id_web | id_x | tipo
-------------------------
1 | 1 | noticia
1 | 73 | imagen
1 | 3 | noticia
2 | 2 | noticia
3 | 1 | noticia
3 | 2 | noticia
3 | 4 | noticia
tags_relaciones
Código:
id_tag | id_x | tipo
-------------------------
23 | 1 | noticia
30 | 73 | imagen
51 | 1 | noticia
64 | 1 | noticia
67 | 2 | noticia
2 | 21 | imagen
98 | 2 | noticia
45 | 3 | noticia
33 | 3 | noticia
29 | 3 | noticia
23 | 4 | noticia
51 | 4 | noticia
Bien con estas 3 tablas yo lo que quier hacer es lo siguiente:

Seleccionar el título y el texto de las noticias que esten relacionadas con la id_web = 3 y que tenga relacionadas las id_tag = 23 e id_tag = 51. Viendo la tabla 'webs_relaciones' la id_web = 3 tiene asociadas 3 noticias (la 1, 2 y 4), y viendo la tabla 'tags_relaciones' comprobamos que:

La noticia 1 tiene las tags: 23, 51 y 64
La noticia 2 tiene las tags: 67 y 98
La noticia 4 tiene las tags: 23 y 51

Por lo tanto la consulta debería devolverme el título y el texto de las noticias 1 y 4 que son las que tienen los tags 23 y 51 que buscabamos.

Pues nada, que dicho con palabras es relativamente sencillo, pero no tengo ni idea de como hacer esto porque estoy empezando con las consultas a varias tablas y me pierdo sobre todo a la hora de hacer el WHERE de la consulta. Supongo que sería algo como decirle:

Une la id_noticia con la id_x que sea igual y que tenga tipo = 'noticia' (de webs_relaciones y tags_relaciones)
Busca entre esas uniones los id_tag = 23 y 51 y la id_web = 3

Por favor echadme una mano porque estoy super perdido. Muchisimas gracias
  #2 (permalink)  
Antiguo 06/07/2011, 07:59
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta a 3 tablas

Hola SubZero_mb:

Tengo algunas dudas en cuanto al problema que lamentablemente no aclaran los datos, y es con respecto a si existiera alguna noticia que se relacione con sólo alguno de los tagas (en este caso con el 23 o 51), no sé si también se tenga que presentar o solo se deben presentar aquellas noticias que se relacionen con ambos tags... para el ejemplo voy a suponer esto ultimo: creo que podría quedar más o menos así:

Código MySQL:
Ver original
  1. mysql> create table noticias (id_noticia int, titulo varchar(15),
  2.     -> texto varchar(15));
  3. Query OK, 0 rows affected (0.06 sec)
  4.  
  5. mysql> insert into noticias values (1, 'titulo 1', 'texto noticia 1'),
  6.     -> (2, 'titulo 2', 'texto noticia 2'),
  7.     -> (3, 'titulo 3', 'texto noticia 3'),
  8.     -> (4, 'titulo 4', 'texto noticia 4');
  9. Query OK, 4 rows affected (0.01 sec)
  10. Records: 4  Duplicates: 0  Warnings: 0
  11.  
  12. mysql> create table webs_relaciones (id_web int, id_x int,
  13.     -> tipo varchar(10));
  14. Query OK, 0 rows affected (0.08 sec)
  15.  
  16. mysql> insert into webs_relaciones values (1, 1, 'noticia'),
  17.     -> (1, 73, 'imagen'), (1, 3, 'noticia'), (2, 2, 'noticia'),
  18.     -> (3, 1, 'noticia'), (3, 2, 'noticia'), (3, 4, 'noticia');
  19. Query OK, 7 rows affected (0.01 sec)
  20. Records: 7  Duplicates: 0  Warnings: 0
  21.  
  22. mysql> create table tags_relaciones (id_tag int, id_x int,
  23.     -> tipo varchar(10));
  24. Query OK, 0 rows affected (0.06 sec)
  25.  
  26. mysql> insert into tags_relaciones values (23, 1, 'noticia'),
  27.     -> (30, 73, 'imagen'), (51, 1, 'noticia'), (64, 1, 'noticia'),
  28.     -> (67, 2, 'noticia'), (2, 21, 'imagen'), (98, 2, 'noticia'),
  29.     -> (45, 3, 'noticia'), (33, 3, 'noticia'), (29, 3, 'noticia'),
  30.     -> (23, 4, 'noticia'), (51, 4, 'noticia');
  31. Query OK, 12 rows affected (0.01 sec)
  32. Records: 12  Duplicates: 0  Warnings: 0
  33.  
  34. mysql> select N.* from noticias N
  35.     -> inner join webs_relaciones W
  36.     -> on W.id_x = N.id_noticia
  37.     -> inner join (
  38.     -> select id_x from tags_relaciones where id_tag in (23, 51)
  39.     -> group by id_x having count(*) = 2) T
  40.     -> on T.id_x = N.id_noticia
  41.     -> where W.id_web = 3;
  42. +------------+----------+-----------------+
  43. | id_noticia | titulo   | texto           |
  44. +------------+----------+-----------------+
  45. |          1 | titulo 1 | texto noticia 1 |
  46. |          4 | titulo 4 | texto noticia 4 |
  47. +------------+----------+-----------------+
  48. 2 rows in set (0.00 sec)

Si fuera el caso de que también quieres mostrar aquellas noticias que se relacionen sólo con uno de los tags, lo único que deberías hacer es quitar la condición HAVING del select interno (T)

Dale un vistazo y espero que te sirva...

Saludos
Leo.
  #3 (permalink)  
Antiguo 08/07/2011, 13:22
 
Fecha de Ingreso: marzo-2004
Mensajes: 283
Antigüedad: 20 años, 1 mes
Puntos: 2
Respuesta: Consulta a 3 tablas

Muchas gracias leonardo_josue, la consulta funciona perfectamente y lo que es más importante, estos días he estado mirando información para entenderla y ahora he aprendido muchisimo teniendo como base la consulta que tu hiciste. De nuevo muchas gracias :)

Etiquetas: tabla, tablas
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 00:02.