带限制的 MySQL 计数

我想要做的是对一列进行求和,同时计算它所求和的行数,限制不超过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

但是对于这样一个简单的查询来说,这似乎有点复杂,而且因为它是在一个高流量的脚本中,所以我希望它尽可能地提高性能。

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

76355 次浏览

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

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