62

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

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

我所期望的是 COUNT(*) 最多为 5(我不能假设它在我的代码逻辑中始终为 5,因为它可能有少于 5 个答案),以及最多5 行的得分之和。

相反,我似乎得到的是匹配行的总数(其中用户为 1)作为计数,以及这些行的分数总和。LIMIT 1无论我输入或LIMIT 5什至,数字都不会改变LIMIT 50

我相信在这种情况下会起作用的是

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

但是对于这样一个简单的查询来说,这似乎有点令人费解,而且由于它位于高流量脚本中,我希望它尽可能地高效。

我错过了什么吗?我确实发现了几年前的这个错误报告,它似乎与这个“问题”有关,但我假设它实际上不是一个错误?

4

1 回答 1

66

这实际上是您的查询的工作方式,并且是正常行为。使用LIMIT您不会限制计数或总和,而只会限制返回的行。因此,您的查询将返回n您的LIMIT子句中所述的行。而且由于您的查询实际上只返回一行,因此应用(非零)限制对结果没有影响。

但是,您的第二个查询将按预期工作,并且是解决此问题的既定方法。

于 2013-06-10T09:43:32.523 回答