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;
Quando cerchi ciò che è "simile" a 123 (Elemento-B nel tuo esempio), l'output dovrebbe
Item-A, 2
Item-C, 1
Questa è una scansione completa di articletag
. Quindi, ascolta i suggerimenti nella mia discussione su many:many mapping
.
Se hai bisogno di ottenere informazioni sugli articoli dopo aver eseguito la query, usala come tabella 'derivata'; ad esempio:
SELECT articles.*
FROM ( the above SELECT ) AS x
JOIN articles USING(articleid)
ORDER BY x.ct DESC;
(Puoi rimuovere il ORDER BY
dalla query interna, poiché verrà ignorata di preferenza a quella esterna ORDER BY
.)