MySQL 5.5中LIMIT与子查询求和失效问题求助
问题分析与解决方法
嘿,我来帮你搞定这个MySQL的问题!
为什么你的原查询没生效?
你原来写的查询里,虽然加了ORDER BY date DESC LIMIT 0,4,但这个LIMIT是在聚合函数SUM执行之后才会生效的。MySQL会先把所有满足date<@date AND id_patient=87321 AND value IS NOT NULL的行都找出来,计算它们的总和,然后再对这个单一的SUM结果应用LIMIT——但SUM本身只返回一个值,所以LIMIT等于没起作用,自然会把所有符合条件的行都加起来,而不是只取前4个。
解决方法(适配MySQL 5.5)
我们需要把逻辑调整一下:先筛选出当前行之前的最近4个非NULL值,再对这4个值求和。具体做法是把LIMIT的子查询嵌套一层,让MySQL先拿到前4个符合条件的行,再计算它们的总和。
修改后的SQL语句如下:
SELECT date, value, (SELECT SUM(t.value) FROM (SELECT value FROM mytable WHERE date < m.date AND id_patient = 87321 AND value IS NOT NULL ORDER BY date DESC LIMIT 4) AS t) AS somme FROM mytable m WHERE m.id_patient = 87321;
验证结果
这个查询会完全符合你的预期:
- 比如2019-11-28那一行,之前的4个非NULL值是
1(2019-11-27)、6(2019-11-26)、4(2019-11-25)、3(2019-11-24),总和刚好是14,和你给出的预期结果一致。 - 如果需要支持多个患者,只需要把子查询里的
id_patient = 87321改成id_patient = m.id_patient即可。
内容的提问来源于stack exchange,提问作者Franck Barlet
相关产品推荐
相关产品推荐

