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;
Когато търсите това, което е „подобно“ на 123 (Елемент-B във вашия пример), резултатът трябва
Item-A, 2
Item-C, 1
Това е пълно сканиране на articletag
. Така че, обърнете внимание на съветите в моята дискусия за много:много картографиране
.
Ако трябва да получите информация за статиите след извършване на заявката, използвайте я като "изведена" таблица; например:
SELECT articles.*
FROM ( the above SELECT ) AS x
JOIN articles USING(articleid)
ORDER BY x.ct DESC;
(Можете да премахнете ORDER BY
от вътрешната заявка, тъй като тя ще бъде игнорирана с предпочитание пред външната ORDER BY
.)