Prima di tutto, scusa se ho cambiato un po' i nomi delle tabelle in message
e message_tag
per la leggibilità.
Secondo, non l'ho testato. Usalo piuttosto come un puntatore che come una risposta definitiva.
La query utilizza due sottoquery, che potrebbero non essere così efficienti, probabilmente c'è un margine di miglioramento. Innanzitutto, la query più interna cerca i tag del messaggio corrente. Quindi, la query centrale cerca i messaggi contrassegnati con almeno un tag comune. Il raggruppamento viene utilizzato per ottenere message_id univoco e ordinarli in base al numero di tag comuni. Infine, il JOIN
viene utilizzato per caricare ulteriori dettagli e per filtrare i vecchi messaggi.
Potresti notare che ho usato punti interrogativi invece di '$xyz'
. Questo per evitare la preoccupazione di evadere il contenuto della variabile.
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 < ?