MySQL的;返回可能存在多个事件的最常见事件

时间:2014-11-19 12:49:26

标签: mysql sql greatest-n-per-group

我有一张包含学生ID(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  | 
+------+-------+

3 个答案:

答案 0 :(得分:0)

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

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)

答案 1 :(得分:0)

这在使用聚合查询的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小提琴是here

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

答案 2 :(得分:0)

  

选择       SID,       count(cCODE)为NumberOfClasses
  从       STUDENT_CLASSES   通过...分组       SID   有       count(cCODE)=(           选择最大值(C)           from(选择count(cCODE)为来自STUDID_CLASSES组的C by sID)       )