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;
Lors de la recherche de ce qui est "similaire" à 123 (Item-B dans votre exemple), la sortie devrait
Item-A, 2
Item-C, 1
Ceci est une analyse complète de articletag
. Alors, tenez compte des conseils de ma discussion sur many:many mapping
.
Si vous avez besoin d'obtenir des informations sur les articles après avoir effectué la requête, utilisez-les comme une table « dérivée » ; par exemple :
SELECT articles.*
FROM ( the above SELECT ) AS x
JOIN articles USING(articleid)
ORDER BY x.ct DESC;
(Vous pouvez supprimer le ORDER BY
de la requête interne, puisqu'elle sera ignorée de préférence au ORDER BY
externe .)