En primer lugar, disculpe si cambié un poco los nombres de las tablas a message
y message_tag
para la legibilidad.
En segundo lugar, no probé esto. Úselo más como un indicador que como una respuesta definitiva.
La consulta utiliza dos subconsultas, que pueden no ser tan eficientes, probablemente hay margen de mejora. Primero, la consulta más interna busca las etiquetas del mensaje actual. Luego, la consulta intermedia busca mensajes que estén marcados con al menos una etiqueta común. La agrupación se utiliza para obtener un ID de mensaje único y ordenarlos por número de etiquetas comunes. Por último, JOIN
se utiliza para cargar detalles adicionales y filtrar los mensajes antiguos.
Puede notar que usé signos de interrogación en lugar de '$xyz'
. Esto es para evitar la preocupación de escapar de los contenidos variables.
SELECT message_id, title, date
FROM message
RIGHT JOIN (SELECT message_id, COUNT(*)
FROM message_tag
WHERE tag_id IN
(SELECT MT.tag_id FROM message_tag MT WHERE MT.message_id = ?)
GROUP BY message_id
ORDER BY COUNT(*) DESC) RELATED_MESSAGES
ON message.message_id = RELATED_MESSAGES.message_id
WHERE date < ?