一尘不染

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

mysql

如果我有一个分数表:

    用户游戏分数时间戳
    1 50 50日期
    2 60 40日期
    3 70 25日期
    4 80 18日期

然后我运行查询:

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

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


阅读 540

收藏
2020-05-17

共1个答案

一尘不染

您正在使用MAX,这是一个汇总函数。聚合函数具有将表中的多行视为一组的作用。如果您没有做任何特别的事情,则整个表中的所有行都将被用作一个大组,并且当存在类似的聚集函数时MAX,所有这些行都将被压缩为一个聚合行。这聚光效果会也时有发生的其它集合函数一样MINSUMGROUP_CONCAT和朋友(见:http://dev.mysql.com/doc/refman/5.1/en/group-
by-functions.html)。您也可以使用GROUP BY构造方法应用特定的分组,但是如果不这样做,则聚集功能只会将所有行汇总为一行(但是这种汇总是在应用WHERE 条件,因此仅汇总过滤的行)

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

在许多情况下,人们希望对“具有最大值的任何行”执行某种操作,换句话说,找到具有最大值的行,但使用该行中未聚合的其他列。middaparka提供的解决方案可以做到这一点,还有其他方法也可以实现这一点(针对MySQL分组最大的Google)。有关聚合函数和相关GROUP BY子句的更多常规信息,您可以在这里查看-shameless selfplug-
我的文章:http ://rpbouman.blogspot.com/2007/05/debunking-group-by-
myths.html

2020-05-17