encontrar las publicaciones relacionadas por etiquetas con una publicación específica en mysql
-
06-07-2019 - |
Pregunta
Tengo estas tablas: Publicaciones (post_is, título y texto), Etiquetas (tag_id, etiqueta), Post_tag_nn (id, tag_id, post_id). Quiero una publicación específica que tenga, por ejemplo, 4 etiquetas todas las publicaciones con esas etiquetas, luego todas las publicaciones con tres de esas etiquetas, luego todas las publicaciones con dos de esas etiquetas y así sucesivamente. ¿Cómo puedo construir una consulta SQL para este propósito (en php parece un problema de retroceso = todos los subconjuntos de un conjunto dado).
Solución
Haga una consulta para encontrar las etiquetas de la publicación actual, algo así como
SELECT tag_id
FROM Post_tag_nn
WHERE post_id = $post_id;
Luego, usando esos identificadores de etiqueta, esta consulta debería devolverle los identificadores de las publicaciones con 4,3,2, ... etiquetas coincidentes:
SELECT post_id, COUNT(post_id) AS tag_count
FROM Post_tag_nn
WHERE tag_id IN ($array_of_tag_ids)
GROUP BY post_id
ORDER BY tag_count DESC;
Otros consejos
Si va a desplegar cada publicación con una sola etiqueta, independientemente de lo que haga, es mejor que ejecute una sola consulta por etiqueta para extraer todas las publicaciones con esa etiqueta y luego generar el establece usted mismo.
Algo así como:
select t.id, t.tag_id, p.post_id, p.title, p.text
from post_tag_nn as t, posts p
where p.id = t.post_id
order by t.id
Y luego haz el grupo en tu código. Por supuesto, podría hacer dos consultas diferentes, una donde calcule el orden y el recuento de sus etiquetas y luego una donde retire la publicación de cada etiqueta.