我有一个包含以下数据的表:

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/

10-11 07:36
查看更多