我有一个包含以下数据的表:
id |持续时间
-------------
1 | 2999
2 | 3219
3 | 3129
4 | 319
5 | 3405
6 | 3084
7 | 3450
8 | 3305
9 | 3485
10 | 3483
11 | 3445
12 | 3570
13 | 1712
我想编写一个MYSQL查询,该查询将返回尽可能多的行,以使“持续时间”的总和尽可能接近12000。本质上,我想跟踪持续时间的总和,如果一行将导致持续时间的总和,则跳过它并检查下一个。在上面的数据中,这意味着将返回ID 1,2,3,4和13。我已经寻找了与此相关的其他帖子,但是他们建议的所有查询仅返回ID 1,2,3,4,然后停止,因为ID 5会超出12000的限制-但我需要它继续前进,并检查是否还有任何记录仍可以添加。
我知道我可以返回所有行并遍历PHP中的结果,并跟踪总持续时间,但我宁愿在查询中做到这一点,以提高效率。
任何帮助是极大的赞赏。
最佳答案
这是使用user-defined variables
的一种选择:
select *
from (
select id, duration,
@overallsum:=@overallsum+duration overall,
@prevrunningsum:=@runningsum prevsum,
@runningsum:=case when @runningsum+duration<12000 then @runningsum+duration
else @runningsum
end under12000
from yourtable, (select @overallsum:=0, @runningsum:=0, @prevrunningsum:=0) t
order by id) t
where prevsum != under12000
order by id
SQL Fiddle Demo
关于mysql - 获取列总和尽可能接近预设最大值的记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38236840/