当前位置: 首页 > 面试题库 >

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

郑浩博
2023-03-14
问题内容

如果我有一个分数表:

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

然后我运行查询:

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

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


问题答案:

您正在使用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



 类似资料:
  • 我有两张桌子。 产品品牌 我试图用最多的产品返回前十大品牌型号。 我试过了。 但是它不返回孔模型,只返回 品牌 计数 我也试过 但是我得到了错误: SQLSTATE[42S22]:未找到列:“where子句”中的1054未知列“brands.id”(SQL:选择count(*)作为从whereid=

  • 我试着取一个数字(n),然后乘以它前面的每一个数字,输入4,你得到(1x2x3x4)=24。我的代码返回0。我有一个像这样的附加工作。有什么想法吗?

  • 问题内容: 今天,我了解并决定将其使用和测试。我知道整数是不可变的,因此id应该是(?)相同。但是,当我在提示中进行测试时,我注意到了一些细微的差异,并想找出其背后的原因。 凉!到目前为止,所有签出。但是之后… 好的,所以测试一下,我注意到此行为一直持续到256年。id最多可以是8位数字,然后257将返回更大的id,可以是15位数字。因此类型必须是8个字节。 所以我发现它与8个字节长有关,但是任何

  • 问题内容: 这是我的数据: SQL字段: http **://sqlfiddle.com/#!2/dfe09/1** 对于每个组,我想将返回的item_ID的数量限制为最多2个。我不在乎返回哪个2个。如果该组少于2行,则仅返回1行。 我无法为每个组写一个select top * 2并合并选择,因为我有几百个组。 我不确定从哪里开始,非常感谢您的帮助。 使用MS SQL 2005 (表布局与示例中的

  • 编辑问题以包括所需的行为、特定问题或错误,以及重现问题所需的最短代码。这将有助于其他人回答这个问题。 代码不返回值,而是返回“?”。编译时我没有遇到任何错误。请协助。 代码需要返回需要支付的剩余金额。输出代码1代码2代码3代码4

  • 问题内容: 如果这没有道理,请原谅我的示例。我将尝试使用一种简化的方法来鼓励更多的参与。 考虑如下表: dt | mnth | foo --------------+------------+-------- 2012-12-01 | December | … 2012-08-01 | August | 2012-07-01 | July | 2012-06-01 | June | 2012-05