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;
Når du søger efter, hvad der er "ligner" til 123 (punkt-B i dit eksempel), skal outputtet
Item-A, 2
Item-C, 1
Dette er en fuld scanning af articletag
. Så følg tipsene i min diskussion af many:many mapping
.
Hvis du har brug for at få information om artiklerne efter at have udført forespørgslen, så brug den som en 'afledt' tabel; for eksempel:
SELECT articles.*
FROM ( the above SELECT ) AS x
JOIN articles USING(articleid)
ORDER BY x.ct DESC;
(Du kan fjerne ORDER BY
fra den indre forespørgsel, da den vil blive ignoreret frem for den ydre ORDER BY
.)