2016-07-07 26 views
0

我有下列數據的表:獲取記錄其列總和接近預設的最大盡可能

 
id | duration 
------------- 
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中的結果並記錄總持續時間,但如果可能提高效率,我寧願在查詢中完成此操作。

任何幫助,非常感謝。

回答

0

下面是使用user-defined variables一個選項:

select * 
from (
    select id, duration, 
    @overallsum:[email protected]+duration overall, 
    @prevrunningsum:[email protected] 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 
+0

謝謝!這正是我所追求的。 – user1576510

0

這不是一個很好用的SQL。你可以得到最多的組合,例如6個ID:

select * 
from t t1 left join 
    t t2 
    on t1.id < t2.id left join 
    t t3 
    on t2.id < t3.id left join 
    t t4 
    on t3.id < t4.id left join 
    t t5 
    on t4.id < t5.id left join 
    t t6 
    on t5.id < t6.id 
order by abs(12000, 
      coalesce(t1.duration, 0) + coalesce(t2.duration, 0) + coalesce(t3.duration, 0), + coalesce(t4.duration, 0) + coalesce(t5.duration, 0) + coalesce(t6.duration, 0) 
      ) 
limit 1; 

這不是很有效率 - 它正在尋找所有可能的組合。有13個項目和多達6個元素的組合,它應該在有限的時間內完成。

+0

最終我將在錶行的數百或數千,所以我不認爲這會爲我長期工作。 – user1576510