Nejprve prosím omluvte, že jsem trochu změnil názvy tabulek na message
a message_tag
pro čitelnost.
Za druhé, netestoval jsem to. Použijte jej spíše jako ukazatel než jednoznačnou odpověď.
Dotaz používá dva poddotazy, což nemusí být tak efektivní, pravděpodobně je co zlepšovat. Nejprve nejvnitřnější dotaz hledá značky aktuální zprávy. Poté prostřední dotaz hledá zprávy, které jsou označeny alespoň jednou společnou značkou. Seskupení se používá k získání jedinečného message_id a seřazení podle počtu společných značek. Nakonec JOIN
se používá k načtení dalších podrobností a k odfiltrování starých zpráv.
Můžete si všimnout, že jsem místo '$xyz'
použil otazníky . Je to proto, abychom se vyhnuli péči o únik z obsahu proměnné.
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 < ?