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

ufk*_*ufk 2 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
Run Code Online (Sandbox Code Playgroud)

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

Rol*_*man 19

您正在使用MAX,这是一个聚合函数.聚合函数具有将表中的多行视为一个组的效果.如果你没有做任何特殊的事情,那么整个表中的所有行都将被用作一个大组,并且当MAX聚合函数就像那样时,所有这些行将被压缩成一个聚合行.对于像MINSUM,GROUP_CONCAT和朋友这样的其他聚合函数也会发生这种凝聚效应(参见:http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html).您也可以使用GROUP BY构造应用特定的分组,但是如果不这样,聚合函数的出现只会将所有行合并为一行(但是在应用之后会发生这种聚合)WHERE 条件,因此只聚合过滤的行)

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

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


Joh*_*ker 11

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

SELECT * FROM table_name ORDER BY score DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)