Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL SELECT най-често по групи

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;

Съгласен съм, че това е твърде много за една SQL заявка. Всяко използване на GROUP BY вътре в подзаявка ме кара да трепна. Можете да го направите изглежда по-просто чрез използване на изгледи:

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;

Но по същество върши същата работа зад кулисите.

Коментирате, че бихте могли да направите подобна операция лесно в кода на приложението. Така че защо не го направиш? Направете по-простата заявка, за да получите броя по категория:

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

И сортирайте резултата в кода на приложението.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вмъкнете в MySQL таблица или актуализирайте, ако съществува

  2. Какво представляват изявленията, подготвени от страна на клиента?

  3. Поддържа ли модулът MySQLdb подготвени изявления?

  4. Не може да се генерира разлика от liquibase gradle плъгин

  5. Инсталиране на Percona XtraDB Cluster на CentOS 7