Mysql 按最高分数筛选学生

Mysql 按最高分数筛选学生,mysql,Mysql,我有一张mysql表 表名称“结果” Reg.No SubjectCode Attempt Grade Marks 112108 CMIS 1113 1 D 17 112110 CMIS 1114 1 A 85 112119 CMIS 1114 1 D 18 112108 CMIS 1113 2 D+ 25 112110 CMIS 1113 1

我有一张mysql表

表名称“结果”

Reg.No  SubjectCode  Attempt  Grade  Marks
112108  CMIS 1113    1        D      17
112110  CMIS 1114    1        A      85
112119  CMIS 1114    1        D      18
112108  CMIS 1113    2        D+     25
112110  CMIS 1113    1        D+     25
112107  CMIS 1113    1        B      70
112108  CMIS 1113    3        C      40
112110  CMIS 1113    2        C      40
112119  CMIS 1114    2        C      42
112120  CMIS 1114    1        D      17
这是关于学生成绩的。
学生至少需要一个“C” (分数>40分)通过该科目。
在通过之前,学生可以 几次尝试。
但从第二次尝试的最高等级开始 可以得到的是“C”
因此无法通过该科目的学生 第一次尝试,过去是在通过测试之前再尝试一次
因此,对于最终结果表,每个科目都将考虑最高的成绩。(最高成绩由最高分数给出)
例如,CMIS 1113的最高分数112108是40。
因此,同样地,我希望获得ecch科目的学生成绩(但始终会考虑最高分数)
实际上,我的预期结果表应该是这样的

Reg.No  SubjectCode  Attempt  Grade  Marks
112110  CMIS 1114    1        A      85
112107  CMIS 1113    1        B      70
112108  CMIS 1113    3        C      40
112110  CMIS 1113    2        C      40
112119  CMIS 1114    2        C      42
112120  CMIS 1114    1        D      17
那么,如何使用sql查询检索这些数据呢

试着这样做

SELECT * FROM results WHERE marks > 40 Order By Marks Desc
这将列出大于40的结果,并首先显示最高分。您也可以使用limit,以便根据需要获取记录

SELECT * FROM results WHERE marks > 40 Order By Marks Desc

这将列出大于40的结果,并首先显示最高分。您也可以使用limit,以便您可以根据需要获取记录。

若要每个学生仅获得一个值,请按Reg.No和SubjectCode分组,然后获得每个科目的最大值。此查询应适用于以下情况:

SELECT      
    `Reg.No`,
    `SubjectCode`,
    `Attempt`,
    `Grade`,
    MAX(`marks`) AS marks
FROM        
    `results` 
GROUP BY    
    `Reg.No`, `SubjectCode`  
为了获得所有列,您需要两个查询,它们可以与一个子查询放在一起。它将如下所示:

SELECT * 
FROM
    (SELECT * 
     FROM `results` 
     ORDER BY `Grade` ASC) AS t
GROUP BY    
    `Reg.No`, `SubjectCode` 
ORDER BY    
    `Grade` ASC

“内部查询”将获得所有结果,并按
等级
列从低到高排列行。“外部查询”将不仅仅对它们进行分组(不使用
MAX
功能)。这只会导致每个分组的最后一行,这比最大结果(正如我们在“内部查询”中那样排序)要得到每个学生只有一个值,您可以按Reg.No和SubjectCode分组,然后得到每个科目的最大值。此查询应适用于以下情况:

SELECT      
    `Reg.No`,
    `SubjectCode`,
    `Attempt`,
    `Grade`,
    MAX(`marks`) AS marks
FROM        
    `results` 
GROUP BY    
    `Reg.No`, `SubjectCode`  
为了获得所有列,您需要两个查询,它们可以与一个子查询放在一起。它将如下所示:

SELECT * 
FROM
    (SELECT * 
     FROM `results` 
     ORDER BY `Grade` ASC) AS t
GROUP BY    
    `Reg.No`, `SubjectCode` 
ORDER BY    
    `Grade` ASC

“内部查询”将获得所有结果,并按
等级
列从低到高排列行。“外部查询”将不仅仅对它们进行分组(不使用
MAX
功能)。这将只为每个分组生成最后一行,这比最大结果(正如我们在“内部查询”中那样排序的那样)要高。

使用子查询确定最高标记并连接到该标记:

SELECT r.`Reg.No`, r.SubjectCode, MAX(Attempt), r.Grade, r.marks
FROM results r
JOIN (SELECT `Reg.No`, SubjectCode, MAX(marks) AS marks
   FROM results
   GROUP BY 1, 2) m
   ON m.`Reg.No` = r.`Reg.No`
   AND m.SubjectCode = r.SubjectCode
   AND m.marks = r.marks
GROUP BY 1, 2, 4, 5

外部分组是当学生多次获得同一科目的同一分数时打破联系。

使用子查询确定最高分数并加入:

SELECT r.`Reg.No`, r.SubjectCode, MAX(Attempt), r.Grade, r.marks
FROM results r
JOIN (SELECT `Reg.No`, SubjectCode, MAX(marks) AS marks
   FROM results
   GROUP BY 1, 2) m
   ON m.`Reg.No` = r.`Reg.No`
   AND m.SubjectCode = r.SubjectCode
   AND m.marks = r.marks
GROUP BY 1, 2, 4, 5


外部分组是当一名学生多次获得同一科目的相同分数时,打破联系。

这只会给出>40分的分数。但是如果有人仍然尝试一次ans,如果它小于40,那么我想显示当前获得的最高分数。此查询只给出高于40的结果。在DESC use limit 1之后。它将只返回一条得分最高的记录。这将只给出大于40的分数。但是如果有人仍然尝试一次ans,如果它小于40,那么我想显示当前获得的最高分数。此查询只给出高于40的结果。在DESC use limit 1之后。它只会返回一条最高分数的记录谢谢你,先生。这很好。但我也想得到分数。当我选择“分数”列时,它不会给出预期的结果。它会显示最大分数,但分数不属于最大分数。如果没有“分数”列,你的查询工作正常。但是如果我得到“分数”列,预期的结果不会出现。这是正确的。如果希望该最大值的所有附加列,则需要更复杂的查询。给我一两分钟的时间来扩展我的答案。总是很乐意帮忙。我真的很喜欢这样的问题。顺便说一句:请随意投票并接受答案。我喜欢你的解释。这有助于我学习新东西。谢谢你的好意,先生。我很高兴它帮助了你。我总是尽量不给出一个正确的解决方案,还要解释它为什么和如何解决。谢谢你,先生。这很好。但我也想得到分数。当我选择“分数”列时,它不会给出预期的结果。它显示最大(分数),但分数不属于最大(分数)。如果没有“out grade”列,则查询工作正常。但如果我得到“grade”列,则预期结果将不正确。如果希望该最大值的所有附加列,则需要更复杂的查询。给我一两分钟的时间来扩展我的答案。总是很乐意帮忙。我真的很喜欢这样的问题。顺便说一句:请随意投票并接受答案。我喜欢你的解释。这有助于我学习新东西。谢谢你的好意,先生。我很高兴它帮助了你。我总是试着不只是给出正确的答案,而是解释,为什么以及如何解决它。可能会从结果中添加此项,因为它仍然缺少最高分的分数列。如果这样做有效,那么接受答案,给人一些信任。此查询可能会如预期的那样工作,但有了连接,它会复杂得多。它在内部使用三个查询,两个临时表和文件排序,并使用连接缓冲区。我也不喜欢组的数值,因为你可以简单地搞乱查询,当您更改列的顺序或添加一些新的列时。可能会从结果中添加此项,但仍缺少最高分的“成绩”列。如果这样做有效,则接受答案以给人一些分数。此查询可能会按预期工作,但对于联接,它要复杂得多。它在内部使用三个查询,两个临时表和文件排序,并使用联接缓冲区。我也不喜欢组的数值,因为当您更改列的顺序或添加一些新的列时,您可能会简单地搞乱查询。