MySQL中使用SUM()函数时LIMIT不生效的求和问题求助
解决MySQL中SUM()与LIMIT结合时的求和错误问题
问题原因
你碰到的核心问题是MySQL的执行顺序逻辑:聚合函数SUM()会优先于ORDER BY和LIMIT执行。具体来说,MySQL会先通过WHERE子句筛选出所有medid=1004的行,直接对这些行的stockinquantity计算总和,之后才会执行ORDER BY和LIMIT——但此时聚合结果已经只剩一行数据了,LIMIT 2根本起不到过滤前两行的作用,所以最终得到的是所有3条数据的总和(147+20+45=212),而非你预期的前两行之和。
解决方案:先限定数据范围,再求和
要实现对排序后前两行数据的求和,需要先通过子查询筛选出目标行,再在外层对这部分数据执行SUM()计算。
正确的查询语句
SELECT SUM(stockinquantity) AS stockinquantity FROM ( SELECT stockinquantity FROM tblmedstockin WHERE medid = 1004 ORDER BY stockindate ASC LIMIT 2 ) AS temp_table;
执行过程与结果验证
这条语句会先运行内层子查询,得到medid=1004且按stockindate升序排列的前两条数据:
+-----------------+ | stockinquantity | +-----------------+ | 147 | | 20 | +-----------------+
接着外层查询对这两个值求和,就能得到你想要的结果:
+-----------------+ | stockinquantity | +-----------------+ | 167 | +-----------------+
补充方案(适用于MySQL 8.0+)
如果你的MySQL版本支持窗口函数,也可以用ROW_NUMBER()标记行号,再筛选行号≤2的记录求和,写法更灵活:
SELECT SUM(stockinquantity) AS stockinquantity FROM ( SELECT stockinquantity, ROW_NUMBER() OVER(ORDER BY stockindate ASC) AS row_num FROM tblmedstockin WHERE medid = 1004 ) AS temp_table WHERE row_num <= 2;
内容的提问来源于stack exchange,提问作者Knuckles
相关产品推荐
相关产品推荐

