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;
När du söker efter vad som är "liknar" 123 (Artikel-B i ditt exempel), bör utdata
Item-A, 2
Item-C, 1
Detta är en fullständig genomsökning av articletag
. Så följ tipsen i min diskussion om many:many mapping
.
Om du behöver få information om artiklarna efter att ha utfört frågan, använd den som en "deriverad" tabell; till exempel:
SELECT articles.*
FROM ( the above SELECT ) AS x
JOIN articles USING(articleid)
ORDER BY x.ct DESC;
(Du kan ta bort ORDER BY
från den inre frågan, eftersom den kommer att ignoreras framför den yttre ORDER BY
.)