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;
Ao pesquisar o que é 'semelhante' a 123 (Item-B no seu exemplo), a saída deve
Item-A, 2
Item-C, 1
Esta é uma verificação completa de
articletag
. Portanto, preste atenção às dicas em minha discussão sobre many:many mapping
. Se você precisar obter informações sobre os artigos após realizar a consulta, use-a como uma tabela 'derivada'; por exemplo:
SELECT articles.*
FROM ( the above SELECT ) AS x
JOIN articles USING(articleid)
ORDER BY x.ct DESC;
(Você pode remover o
ORDER BY
da consulta interna, pois ela será ignorada de preferência à externa ORDER BY
.)