我有一张包含学生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 |
+------+-------+
答案 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) )