Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL SELECT am häufigsten nach Gruppe

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.