【问题标题】:Mysql: Select max count from different idMysql:从不同的ID中选择最大计数
【发布时间】:2013-06-08 10:53:20
【问题描述】:

我有两个表学生和考试的样子

student(studentid,lastname,firstname,class)

exam(studentid,course,mark,result)

我需要找到最好的学生,每节课的分数是 90、100。

这就是我需要的

class     studentid  best
K11       K1101       3    
K12       K1203       2
K13       K1305       2

这是我的第一个代码

Select st.class, st.studentid, count(st.mark) as best
From exam e inner join student st on e.studentid = st.studentid
Where e.mark = 90 or e.mark = 100
Group by e.studentid

返回

class     studentid  best
K11       K1101       3
K12       K1201       1
K12       K1203       2
K13       K1305       2

所以我尝试另一个代码

Select st.class, st.studentid, count(st.mark) as best
From exam e inner join student st on e.studentid = st.studentid
Where e.mark = 90 or e.mark = 100
Group by st.class
Having count(e.mark) = 
       (Select max(count)
        From (Select count(ex.mark) count
              From exam ex
              Where ex.mark = 90 or ex.mark = 100
              Group by ex.studentid) a) 

仍然得到错误的答案

class     studentid  best
K11       K1101       3
K12       K1201       3

更新数据

对不起,不清楚的问题。我需要找到每个班级的学生有很多门课程的准确分数是 90 或 100。这是我的数据

考试

studentid    course   mark result
K1101        DB       100  Pass
K1101        CD       90   Pass
K1101        DIP      95   Pass
K1101        OT       100  Pass
K1102        DB       97   Pass
K1102        CD       65   Pass
K1102        DIP      70   Pass
K1102        OT       44   Fail
K1201        DB       85   Pass
K1201        CD       90   Pass
K1201        DIP      76   Pass
K1201        OT       65   Pass
K1202        DB       69   Pass
K1202        CD       32   Fail
K1202        DIP      57   Pass
K1202        OT       96   Pass
K1203        DB       90   Pass
K1203        CD       87   Pass
K1203        DIP      90   Pass
K1203        OT       91   Pass
K1301        DB       75   Pass
K1301        CD       79   Pass
K1301        DIP      78   Pass
K1301        OT       63   Pass
K1305        DB       90   Pass
K1305        CD       93   Pass
K1305        DIP      100  Pass
K1305        OT       80   Pass

在这种情况下,在 K11 班,学生 K1101 有 2 门课 100,1 门 90,所以我数 3

【问题讨论】:

  • 显示源数据。
  • 只是好奇,不应该是e.mark BETWEEN 90 AND 100。奖励必须有准确分数(90、100)但不能介于两者之间的学生是没有意义的。 id为K1201的学生真的可以有一个90或100分吗?
  • 你能展示一些示例数据吗?
  • 只需更新数据,是的,我需要准确的分数 90 或 100。

标签: mysql count group-by max


【解决方案1】:

试试这个

Select   st.class, st.studentid, count(mark) as best
From exam e inner join student st on e.studentid = st.studentid
Where e.mark between 90 and 100
and e.mark in (select max(mark) from exam group by studentid)
Group by st.class 

【讨论】:

  • 这样在 K12 班中,count(mark) 将返回 3,因为它将所有学生的分数分组。感谢您的帮助
【解决方案2】:

您的结果似乎与问题的措辞不一致。你说:“我需要找到最好的学生,每个班级都有90、100分。”但是,该表仅显示每个班级的一名学生,即使计数列有三个。

如果您需要了解每个班级的信息,那么您应该按班级分组。如果您需要显示所有学生。把这些放在一起:

Select st.class, group_concat(st.studentid), count(st.mark) as best
From exam e inner join
     student st
     on e.studentid = st.studentid
Where e.mark in (90, 100)
Group by st.class;

如果你想统计一个学生的班级人数:

Select st.studentid, group_concat(st.class), count(st.mark) as best
From exam e inner join
     student st
     on e.studentid = st.studentid
Where e.mark in (90, 100)
Group by st.studentid;

【讨论】:

  • 对不起我的问题。但这将返回 count(st.mark) 为 3,并将 K12 班的所有学生分组
猜你喜欢
  • 2021-02-04
  • 2013-10-20
  • 2012-03-16
  • 2023-02-06
  • 2013-09-29
  • 2013-03-20
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多