MySQL COUNT 带有 LIMIT

80

我想要做的是对一列进行求和,并且计算它正在求和的行数,但限制不超过5行。所以我的查询是:

SELECT COUNT(*), SUM(score) FROM answers WHERE user=1 LIMIT 5

我期望得到的是COUNT(*)计数最多为5行(在我的代码逻辑中不能假设它总是5行,因为它可能少于5个答案),并且这5行得分的总和。

相反,我看到返回的似乎是匹配行(用户为1)的总数作为计数,并且这些行的得分总和。无论我使用LIMIT 1LIMIT 5甚至LIMIT 50,这些数字都不会改变。

我认为在这种情况下,以下方法将奏效:

SELECT COUNT(*), SUM(score) FROM (SELECT * FROM answers WHERE user=1 LIMIT 5) AS a

但对于这样一个简单的查询来说,似乎有点过于复杂了,而且由于它在一个高流量的脚本中,我希望它能尽可能地高效。

我是否漏掉了什么?我发现几年前有一个与这个“问题”相关的错误报告,但我认为这实际上不是一个 bug?


6
LIMIT 5 会返回至多5行结果。SELECT COUNT(*), SUM(score) FROM answers 会返回1行结果。1 < 5。你在第二个查询中做对了。 - ta.speot.is
没错 @ta.speot.is ,我想我只是需要有人验证我没有做什么愚蠢的事情。我本来以为有一个更简单的查询可以做到我需要的,但显然不是这样。 - Lee
4
еңЁеөҢеҘ—жҹҘиҜўдёӯдҪҝз”Ёselect 1иҖҢдёҚжҳҜselect *зҗҶи®әдёҠеҸҜд»ҘеҮҸе°‘еҶ…еӯҳзҡ„дҪҝз”ЁгҖӮ - Bogdan Gusiev
1个回答

83
这实际上是您的查询如何工作并且是正常行为。使用LIMIT,您不会限制计数或总和,而只会限制返回的行数。因此,您的查询将按照LIMIT子句中所述返回n行。由于您的查询实际上只返回一行,应用(非零)限制对结果没有影响。
但是,您的第二个查询将按预期工作,并且是解决此问题的已建立方法。

一旦SO计时器允许我,我会接受您的答案。但是你是正确的,我觉得我只是需要别人向我解释一下,这样我就知道自己没有做什么傻事。第二个查询确实有效,并且似乎是唯一的方法。 - Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接