如果我有一个分数表:
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
聚合函数就像那样时,所有这些行将被压缩成一个聚合行.对于像MIN
和SUM
,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)