SELECT t1.*
FROM (SELECT tag, category, COUNT(*) AS count
FROM tags INNER JOIN stuff USING (id)
GROUP BY tag, category) t1
LEFT OUTER JOIN
(SELECT tag, category, COUNT(*) AS count
FROM tags INNER JOIN stuff USING (id)
GROUP BY tag, category) t2
ON (t1.tag = t2.tag AND (t1.count < t2.count
OR t1.count = t2.count AND t1.category < t2.category))
WHERE t2.tag IS NULL
ORDER BY t1.count DESC;
Sono d'accordo che questo è un po' troppo per una singola query SQL. Qualsiasi utilizzo di GROUP BY
all'interno di una sottoquery mi fa sussultare. Puoi farlo look più semplice utilizzando le visualizzazioni:
CREATE VIEW count_per_category AS
SELECT tag, category, COUNT(*) AS count
FROM tags INNER JOIN stuff USING (id)
GROUP BY tag, category;
SELECT t1.*
FROM count_per_category t1
LEFT OUTER JOIN count_per_category t2
ON (t1.tag = t2.tag AND (t1.count < t2.count
OR t1.count = t2.count AND t1.category < t2.category))
WHERE t2.tag IS NULL
ORDER BY t1.count DESC;
Ma fondamentalmente sta facendo lo stesso lavoro dietro le quinte.
Commenta che potresti eseguire facilmente un'operazione simile nel codice dell'applicazione. Allora perché non lo fai? Esegui la query più semplice per ottenere i conteggi per categoria:
SELECT tag, category, COUNT(*) AS count
FROM tags INNER JOIN stuff USING (id)
GROUP BY tag, category;
E ordina il risultato nel codice dell'applicazione.