遇到一个很有趣的问题,查询数据库中的最大值
首先放一个测试数据表
如果我想找出最高的分数
SELECT max(score) score from score_test
结果毫无疑问
那我想找出每个class最高的分数
SELECT class,max(score) score from score_test GROUP BY class
结果为
很明显也是正确的
那现在我想知道每个class最高的分数和人,那么该怎么做呢?查询的字段加个name?我试试
SELECT name,class,max(score) score from score_test GROUP BY class
不对了,class3最高分55是对的,但是人名却错了,这是为什么呢?
因为
包含 GROUP BY 的 SQL 语句,被 select 的列要么使用聚合函数,要么出现在GROUP BY 子句中。
什么是聚合函数,count(*)就是经典的聚合函数,这里不多说
那么怎么写sql才能获取到正确的结果呢?
方法一:这是我觉得比较合理的
SELECT a.name,a.class,a.score
FROM score_test a
LEFT JOIN score_test b
on a.class = b.class and a.score < b.score
where b.score is null
结果没毛病
这段sql简单来说通过left join和on的特性实现的,left join语句的主表数据必定存在,从表的数据则要通过on后的条件是否符合和判断是否存在。也就是说,在主表和从表都一样的情况下,从表score不存在大于主表score的数据,不就是最大的数据么。
方法二:这个也行,但是感觉不是非常严谨
SELECT a.name,a.class,a.score
FROM score_test a INNER JOIN
(SELECT class,MAX(score) score FROM score_test GROUP BY class) b
ON a.class = b.class and a.score = b.score
结果也没错
其实还有其他的方式,但我个人感觉并不是很好用