MySQL返回最小值但不返回n​​ull

时间:2014-11-15 07:31:43

标签: mysql sql select

我有一张桌子,里面有学生和成绩栏(A-F)。学生可以多次出现在考试中。有时候学生会注册,但不会出现进行测试,因此不会输入成绩,但会输入学生记录。

我希望每个学生都能获得最好的成绩。当我做min(等级)时,如果有任何记录为null,则选择null而不是' A-F'表明结果合适。如果成绩存在,我想获得成绩,如果没有成绩,我想获得成绩。

SELECT `name`,min(grade) FROM `scores` group by `name`

Id | Name | Grade
1  | 1    | B
2  | 1    | 
3  | 1    | A
4  | 2    | C
5  | 2    | D

对于名称1,它取得第二个记录,而不是第三个记录具有' A'。

2 个答案:

答案 0 :(得分:2)

根据评论中的对话,最简单的解决方案可能是将空字符串转换为null,并让内置min函数完成繁重工作:

ALTER TABLE scores MODIFY grade VARCHAR(1) NULL;

UPDATE scores
SET    grade = null
WHERE  grade = '';

SELECT   name, MIN(grade)
FROM     scores
GROUP BY name

如果这是不可能的,你可以使用的一个诡计就是让case表达式将空字符串转换为F之后你知道的东西:

SELECT   name, 
         MIN(CASE grade WHEN '' THEN 'DID NOT PARTICIPATE' ELSE grade END)
FROM     scores
GROUP BY name

如果您确实需要空字符串,则可以在case周围添加另一个min表达式:

SELECT name, CASE best_grade WHEN 'HHH' THEN '' ELSE best_grade END
FROM   (SELECT   name, 
                 MIN(CASE grade WHEN '' THEN 'HHH' ELSE grade END) AS 
                   best_grade
        FROM     scores
        GROUP BY name) t

答案 1 :(得分:0)

将您的查询稍微更改为 -

SELECT `name`,min(grade) FROM `scores` WHERE grade <> "" group by `name`

如果名称分配了等级,则返回最低值,否则结果集将为空