sql >> Databasteknik >  >> RDS >> Mysql

MySQL SELECT vanligast efter grupp

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;

Jag håller med om att det här är lite för mycket för en enda SQL-fråga. All användning av GROUP BY inuti en underfråga får mig att rycka till. Du kan få det att se ut enklare genom att använda vyer:

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;

Men det gör i princip samma arbete bakom kulisserna.

Du kommenterar att du enkelt skulle kunna göra en liknande operation i applikationskoden. Så varför gör du inte det? Gör den enklare frågan för att få antalet per kategori:

SELECT tag, category, COUNT(*) AS count
FROM tags INNER JOIN stuff USING (id)
GROUP BY tag, category;

Och sortera igenom resultatet i applikationskoden.



  1. Hur man hittar den sista dagen i månaden för ett givet datum i MySQL

  2. Hur lägger jag till en referens till MySQL-anslutningen för .NET?

  3. Hur RPAD()-funktionen fungerar i MySQL

  4. SQL Server Performance TOP IO Query -2