SELECT c.articleid, COUNT(*) AS ct
FROM articletag AS b
JOIN articletag AS c ON c.tagid = b.tagid
AND c.articleid != b.articleid
WHERE b.articleid = 123
GROUP BY c.articleid
ORDER BY ct DESC;
Bij het zoeken naar wat 'vergelijkbaar' is met 123 (item-B in uw voorbeeld), zou de uitvoer moeten
Item-A, 2
Item-C, 1
Dit is een volledige scan van articletag
. Let dus op de tips in mijn bespreking van many:many mapping
.
Als u informatie over de artikelen wilt krijgen nadat u de zoekopdracht heeft uitgevoerd, gebruik deze dan als een 'afgeleide' tabel; bijvoorbeeld:
SELECT articles.*
FROM ( the above SELECT ) AS x
JOIN articles USING(articleid)
ORDER BY x.ct DESC;
(U kunt de ORDER BY
verwijderen van de binnenste zoekopdracht, omdat deze wordt genegeerd in plaats van de buitenste ORDER BY
.)