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

[SOLUCIONADO] JOIN 3 tablas relacionadas, búsqueda por tags

Estas en el tema de JOIN 3 tablas relacionadas, búsqueda por tags en el foro de Mysql en Foros del Web. Hola, Necesitaría ayuda para obtener los resultados de una consulta entre 3 tablas asociadas. La consulta es básicamente la búsqueda de registros por medio de ...
  #1 (permalink)  
Antiguo 15/04/2016, 11:34
Ktulu
Invitado
 
Mensajes: n/a
Puntos:
Pregunta JOIN 3 tablas relacionadas, búsqueda por tags

Hola,

Necesitaría ayuda para obtener los resultados de una consulta entre 3 tablas asociadas. La consulta es básicamente la búsqueda de registros por medio de tags.

Para ésto tengo 3 tablas:

NOTICIAS [id | titulo]
TAGS_NOTICIAS [id | id_tag | id_noticia]
TAGS [id | descripcion]

Lo que necesito hacer es que, dado uno o varios tags, se devuelva la(s) noticia(s) que tengan asociados dichos tags. El inconveniente es que necesito que devuelva todos los tags asociados a la noticia si es que hay coincidencia con uno de ellos

Como ejemplo, este sería el caso de éxito:

NOTICIA
[id] 67458
[titulo] Noticia de ejemplo

TAGS_NOTICIAS
[id] 125
[id_tag] 43
[id_noticia] 67458
--------------------
[id] 126
[id_tag] 45
[id_noticia] 67458

TAGS
[id] 43
[descripcion] tag1
--------------------
[id] 45
[descripcion] tag2

Suponiendo que busco noticias con el valor "tag1", el resultado debería ser:

REGISTRO
[id] 67458
[titulo] Noticia de ejemplo
[ntags] tag1, tag2

Paso a mostrarles la consulta:

Código MySQL:
Ver original
  1.   noticias.id,
  2.   noticias.titulo,
  3.   GROUP_CONCAT(tags.descripcion SEPARATOR ", ") AS ntags
  4.   tags_noticias ON tags_noticias.id_noticia = noticias.id
  5.   tags ON tags.id = tags_noticias.id_tag
  6.   tags.descripcion = $variable
  7.   noticias.id

El inconveniente es que los tags son acotados a la coincidencia y sólo devuelve ntags con el valor del tag buscado.

Existe alguna forma de hacer un subquery / LEFT JOIN / etc para obtener todos los tags de la noticia independientemente del tag buscado?

Gracias de antemano
  #2 (permalink)  
Antiguo 15/04/2016, 12:05
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: JOIN 3 tablas relacionadas, búsqueda por tags

Estás buscando sólo por el campo "descripcion" de la tabla Tags. Es obvio que en ese contexto te devolverá solo UN tag coincidente.
El WHERE está incorrectamente armado para buscar todos los tags de una noticia. Deberías buscar:
1) Por id de noticia.
2) Por titulo de noticia.
3) Por el conjunto completo de tags.

Hay otras posibilidades, pero con eso puedes comenzar.-
__________________
¿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 15/04/2016, 15:06
Ktulu
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: JOIN 3 tablas relacionadas, búsqueda por tags

Gracias por responder,

Si bien permito la búsqueda por otros campos (la consulta que puse es una extracción de la consulta real) es fundamental que permita la búsqueda por tags.

Mi Base de Datos consta de 96000 noticias, los usuarios deben poder buscar dado un tag ya que manualmente es imposible y, muchas veces, el título no refleja el contenido principal del texto.

Por lo que insisto que quisiera resolver la búsqueda por tags cualquiera sea el proceso: utilizando JOINS, subquery, selects anidados o lo que sea necesario.

Agradecería me comentes cuales son la otras posibilidades.

Saludos!
  #4 (permalink)  
Antiguo 16/04/2016, 17:57
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: JOIN 3 tablas relacionadas, búsqueda por tags

Creo que no has entendido lo que dije.
La cosa es que si quieres buscar por tags, esa búsqueda no puede realizarse por la igualdad en un campo, es decir, que no puedes poner una condición como esta:
Código MySQL:
Ver original
  1.   tags.descripcion = $variable
porque eso sólo devolverá los registros donde el contenido de ese campo sea exactamente el mismo que el tag ingresado en la variable, y ningún otro valor (además que al crear la sentencia ese tag se transformará en algo que disparará un error de ejecución).
Lo que tienes que hacer es búsquedas basadas en expresiones regulares, o bien en relevancia.
Las primeras usan REGEXP(), la función de MySQL, y se usan para buscar patrones.
Las segundas requieren indices de tipo FULLTEXT y el uso de el uso de las cláusulas MATCH() ... AGAINST().

Dado que puedes tener una lista de tags para buscar, en tu escenario la mejor solución (y la mas usada) es la segunda opción.

MySQL 5.5 Reference Manual / Functions and Operators / Full-Text Search Functions
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 18/04/2016, 19:57
Ktulu
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: JOIN 3 tablas relacionadas, búsqueda por tags

Gracias por responder, despues de varias horas logre hacerlo en una unica consulta. Hasta ahora, todos los casos funcionaron.

Dejo el código por si a alguien mas le sirve.

Código MySQL:
Ver original
  1.     a.id,
  2.     a.titulo,
  3.     a.fecha,
  4.     a.url,
  5.     a.publicado,
  6.     autores.nombre AS autor,
  7.     secciones.descripcion AS seccion,
  8.     GROUP_CONCAT(tags.descripcion) as tags
  9. FROM   noticias a
  10.        INNER JOIN (SELECT   at.id_noticia
  11.                    FROM     tags_noticias at
  12.                             INNER JOIN noticias a
  13.                               ON a.id = at.id_noticia
  14.                             INNER JOIN tags t
  15.                               ON t.id = at.id_tag
  16.                    WHERE    t.descripcion IN ("tag1","tag2")
  17.                    GROUP BY at.id_noticia
  18.                    HAVING   Count(at.id_noticia) = 2) aa
  19.          ON a.id = aa.id_noticia
  20. JOIN tags_noticias ON tags_noticias.id_noticia = a.id
  21. JOIN tags ON tags.id = tags_noticias.id_tag
  22. JOIN autores ON autores.id = a.id_autor
  23. JOIN secciones ON secciones.id = a.id_seccion
  24. /* WHERE a.id = 58648*/
  25. /* WHERE a.id_autor = 2*/
  26. /* WHERE a.id_seccion = 22*/
  27. GROUP BY tags_noticias.id_noticia

Saludos!

Etiquetas: busqueda, join, tags
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 06:33.