Vous pouvez apporter une simple modification à votre requête :
SELECT t.id, t.tag, COUNT(*) AS cnt
FROM tags_xref xrf INNER JOIN
tags t
ON xrf.tag_id = t.id
GROUP BY t.id, t.tag
ORDER BY COUNT(*) DESC
LIMIT 20;
Vraisemblablement, les différents identifiants sont NULL
quand ils ne sont pas appropriés. Si, pour une raison étrange, vous avez en fait stocké des valeurs dans les trois identifiants pour une xréf donnée, vous pouvez faire :
SELECT t.id, t.tag,
(COUNT(story_id) + COUNT(discussion_id) + COUNT(article_id) ) AS cnt
FROM tags_xref xrf INNER JOIN
tags t
ON xrf.tag_id = t.id
GROUP BY t.id, t.tag
ORDER BY cnt DESC
LIMIT 20;