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;
Podczas wyszukiwania tego, co jest „podobne” do 123 (element B w twoim przykładzie), dane wyjściowe powinny
Item-A, 2
Item-C, 1
To jest pełny skan articletag
. Dlatego słuchaj wskazówek w mojej dyskusji na temat wiele:wiele mapowania
.
Jeśli potrzebujesz uzyskać informacje o artykułach po wykonaniu zapytania, użyj go jako tabeli „pochodnej”; na przykład:
SELECT articles.*
FROM ( the above SELECT ) AS x
JOIN articles USING(articleid)
ORDER BY x.ct DESC;
(Możesz usunąć ORDER BY
z wewnętrznego zapytania, ponieważ będzie ignorowane zamiast zewnętrznego ORDER BY
.)