我遇到了一个问题,在创建有效的SQL时,我似乎无法解决这个问题。
以下是mysql设置:
id | countValue | name
1 | 1 | b
2 | 1 | b
3 | 4 | b
4 | 6 | b
5 | 1 | b
我想要做的是抓住前一行(ORDER BY ID DESC)的sum(countValue)变得大于10的最早行
所以在这种情况下它会返回:3
它会返回3因为:
5.countValue + 4.countValue + 3.countValue = 12
所以它会返回id = 3
我最初的尝试:
SELECT id FROM user WHERE sum(countValue) > 3 ORDER by id DESC
然后我改为:
SELECT id From users WHERE HAVING SUM(countValue) > 10 ORDER BY id DESC
如果个别countValue中包含10个以上,则第二个将仅返回id。我需要以前值的总和,这就是我被卡住的原因。
希望这是有道理的,并且会喜欢你们可以提供的任何帮助。
答案 0 :(得分:1)
您想要的是累积或运行总和。在MySQL中,最好的方法是使用变量:
select u.*
from (select u.*, (@s := @s + countValue) as runningCV
from users u cross join
(select @s := 0) params
order by u.id desc
) u
where runningCV - countValue <= 10 and runningCV > 10;
变量@s
用于计算累积和。外部where
子句返回超过“10”阈值的第一个值。
您也可以使用相关子查询执行此操作。但是,除非你的数据很小,否则这将是昂贵的。