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        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查询来检索这些数据呢?

最佳答案

要为每个学生只获取一个值,您可以按 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

“内部查询”将获取所有结果并按 Grade 列从低到高对行进行排序。 “外部查询”将不仅仅是对它们进行分组(不使用 MAX 函数)。这将只产生每个分组的最后一行,而不是最大结果(正如我们在“内部查询”中那样排序的)。

关于mysql - 按最高分筛选学生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27666542/

相关文章:

sql - 带有部分单词的 MySQL 全文搜索

php - 使用 html 表单和 php 更新 mysql 行

php - JOIN 同一表中的类别和子类别

javascript - 无需重复查询即可将一致数据从数据库传递给用户的正确方法

php - 将 require 语句与 if/else if 语句一起使用

mysql - 如何从三个表中选择*?

php - 避免在插入手动递增的收据编号时发生冲突

php - 检索给定月份的所有日期的记录?

php - 如何通过在 cakephp 2.x 中使用可包含行为来获取国家、城市、州的用户

mysql - 生成随机 ID,这些 ID 不是单独唯一的,而是在数据库表中的 2 个字段(列)中唯一的