Først og fremmest, undskyld, at jeg ændrede tabelnavnene lidt til message
og message_tag
for læsbarhed.
For det andet testede jeg ikke dette. Brug det snarere som en pegepind end et entydigt svar.
Forespørgslen bruger to underforespørgsler, som måske ikke er så effektive, der er sandsynligvis plads til forbedringer. Først søger den inderste forespørgsel efter tags for den aktuelle besked. Derefter leder den midterste forespørgsel efter beskeder, der er markeret med mindst ét fælles tag. Grupperingen bruges til at få unikt message_id og sortere dem efter antal almindelige tags. Til sidst, JOIN
bruges til at indlæse yderligere detaljer og til at filtrere de gamle meddelelser fra.
Du bemærker måske, at jeg brugte spørgsmålstegn i stedet for '$xyz'
. Dette er for at undgå bekymringen om at undslippe det variable indhold.
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 < ?