2016-07-07 2 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 쿼리를 작성하려면 "duration"의 합계는 가능한 한 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을 사용하지 않습니다. 당신은 최대로 ID 6 개, 말,에와 가장 가까운 조합을 얻을 수 있습니다 :

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