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;
Ich stimme zu, dass dies für eine einzelne SQL-Abfrage etwas zu viel ist. Jede Verwendung von GROUP BY
in einer Unterabfrage lässt mich zusammenzucken. Sie können es aussehen einfacher durch Verwendung von Ansichten:
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;
Aber es macht im Grunde die gleiche Arbeit hinter den Kulissen.
Sie kommentieren, dass Sie eine ähnliche Operation problemlos im Anwendungscode ausführen könnten. Also warum machst du das nicht? Führen Sie die einfachere Abfrage durch, um die Anzahl pro Kategorie zu erhalten:
SELECT tag, category, COUNT(*) AS count
FROM tags INNER JOIN stuff USING (id)
GROUP BY tag, category;
Und sortieren Sie das Ergebnis im Anwendungscode.