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;
Wenn Sie nach etwas suchen, das 123 „ähnlich“ ist (in Ihrem Beispiel Artikel-B), sollte die Ausgabe
seinItem-A, 2
Item-C, 1
Dies ist ein vollständiger Scan von articletag
. Beachten Sie also die Tipps in meiner Diskussion über many:many-Mapping
.
Wenn Sie nach der Abfrage Informationen zu den Artikeln benötigen, verwenden Sie diese als „abgeleitete“ Tabelle; zum Beispiel:
SELECT articles.*
FROM ( the above SELECT ) AS x
JOIN articles USING(articleid)
ORDER BY x.ct DESC;
(Sie können den ORDER BY
entfernen aus der inneren Abfrage, da sie gegenüber dem äußeren ORDER BY
bevorzugt ignoriert wird .)