MySQL;返回可能有多个最频繁出现的事件



我有一个表格,上面有学生证(sID)和他们正在参加的课程(cCODE)。

我正在尝试检索上课次数最多的学生的学生 ID,因此查询需要考虑到可能存在平局的事实。

我知道同一 sID 的最高出现次数将指示我正在寻找的那个 所以如果我只是想检索顶级记录,我会去

mysql> select sID, count(sID) as NumberOfClasses
-> from STUDENT_CLASSES
-> group by sID
-> order by NumberOfClasses desc
-> limit 1;
+------+-----------------+
| sID  | NumberOfClasses |
+------+-----------------+
| 2040 |               3 |
+------+-----------------+

我试过了

mysql> select sID, count(sID) as NumberOfClasses
-> from STUDENT_CLASSES
-> group by sID
-> having NumOfClasses=3;
+------+-----------------+
| sID  | NumberOfClasses |
+------+-----------------+
| 2040 |               3 |
| 3040 |               3 |
+------+-----------------+

这有效,但只是因为我知道任何人正在处理的最大项目数的值是 3,我需要的是某种方式在 = 之后放置一个 MAX() 函数,该函数将计算新创建的表的 NumberOfProjects 列中的最大值....

有什么想法吗?

这是原始STUDENT_CLASSES表...

mysql> select * from STUDENT_CLASSES;
+------+-------+
| sID  | cCODE | 
+------+-------+
| 2040 | C101  |
| 2040 | C102  |         
| 2040 | C103  | 
| 3282 | C101  | 
| 3282 | C102  | 
| 2113 | C105  | 
| 3040 | C102  | 
| 3040 | C105  | 
| 3040 | C108  | 
+------+-------+

您是否尝试过使用子查询组合这两种方法?

select sID, count(sID) as NumberOfClasses
from STUDENT_CLASSES
group by sID
having count(sID) = (select count(sID) N from STUDENT_CLASSES group by sID order by N desc limit 1)

选择 sID, count(cCODE) as NumberOfClasses
从 STUDENT_CLASSES 分组依据 sID 拥有 计数(cCODE) = ( 选择最大值(C) 从 ( 选择 count(cCODE) 作为 C 从 STUDENT_CLASSES 按 sID 分组) )

这在

MySQL中使用聚合查询有点痛苦。 我建议只使用变量

select sID, NumberOfClasses
from (select sID, count(sID) as NumberOfClasses,
             @max := if(count(sID) > @max, count(sID), @max) as unused
      from STUDENT_CLASSES cross join
           (select @max := -1) vars
      group by sID
     ) t
where NumberOfClasses = @max;

编辑:

好的,正确且经过测试的答案是:

select sID, NumberOfClasses
from (select t.*,
             @max := if(NumberOfClasses > @max, NumberOfClasses, @max) as unused
      from (select sID, count(sID) as NumberOfClasses
            from STUDENT_CLASSES cross join
                 (select @max := -1) vars
            group by sID
           ) t
     ) t
where NumberOfClasses = @max;

SQL 小提琴在这里。

换句话说,需要先完成聚合,然后再进行变量赋值。 这是出于一个晦涩的原因,涉及聚合的处理顺序。 如果只有MySQL支持窗口函数,这将更容易,更标准,并且与其他数据库兼容。

最新更新