Först och främst, ursäkta att jag ändrade tabellnamnen lite till message
och message_tag
för läsbarhet.
För det andra testade jag inte detta. Använd det snarare som en pekare än ett definitivt svar.
Frågan använder två underfrågor, som kanske inte är så effektiva, det finns förmodligen ett utrymme för förbättringar. Först letar den innersta frågan efter taggarna för det aktuella meddelandet. Sedan söker den mellersta frågan efter meddelanden som är markerade med minst en gemensam tagg. Grupperingen används för att få unikt meddelande_id och sortera dem efter antal vanliga taggar. Sist, JOIN
används för att ladda ytterligare information och för att filtrera bort gamla meddelanden.
Du kanske märker att jag använde frågetecken istället för '$xyz'
. Detta för att undvika bry sig om att undkomma variabelinnehållet.
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 < ?