mysql:select max(score)不返回相关的行数据

时间:2010-01-17 14:06:34

标签: mysql max

如果我有一个分数表:

    user game score timestamp
    1    50   50    date
    2    60   40    date
    3    70   25    date
    4    80   18    date

我运行查询:

select user, game, max(score), timestamp from scores

我将收到20的最高分数,但返回的其余列不是来自同一行。

3 个答案:

答案 0 :(得分:19)

您正在使用MAX,这是一个聚合函数。聚合函数具有将表中的多个行作为一个组进行处理的效果。如果您没有做任何特殊操作,整个表中的所有行都将用作一个大组,当有MAX之类的聚合函数时,所有这些行都将压缩为一个聚合行。对于MINSUMGROUP_CONCAT和朋友(参见:http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html)等其他聚合函数,也会发生这种凝聚效应。您还可以使用GROUP BY构造应用特定分组,但如果不这样,聚合函数的出现只会将所有行合并为一行(但在应用{{1}后会发生这种聚合} condition,所以只聚合过滤的行)

现在,由于聚合函数的这种压缩或“减少”效应,可以通过某种方式从多个值中产生一个值。对于WHERE,这种方式是仅列出您作为参数传递给MAX的表达式的所有实例的最大值。但是您的其他列没有这样的聚合函数。对于大多数数据库产品,MAX列表中出现的未聚合列和聚合列都是错误的。但MySQL的行为错误/不同,只返回SELECT位中列出的每个非聚合表达式的可用值之一。哪个值取决于mysql - 您不能依赖任何特定的算法。

在许多情况下,人们想要对“具有最大值的任何行”执行某些操作,换句话说,查找具有最大值作为值的行,但使用该行中的其他列进行非聚合。 middaparka提供的解决方案就是这样做的,并且还有其他方法可以实现这一点(google for MySQL group-wise maximum)。有关聚合函数和相关SELECT子句的更多一般信息,您可以在此处查看--shameless selfplug-我的文章:http://rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html

答案 1 :(得分:11)

由于您没有使用GROUP子句,因此max函数将从表中返回最大值。因此,如果要返回最高分的匹配数据,则需要:

SELECT * FROM table_name ORDER BY score DESC LIMIT 1

答案 2 :(得分:1)

您的查询按设计运行:它列出了用户,并获得了最高的总分。

要获得得分最高的用户,可以使用

select user, game, score, timestamp from scores ORDER by score DESC limit 1