2013-06-14 6 views
5

그래서 가지 여기 난처한 상황에 빠진거야,이 같은 쿼리를 실행할 수있는 방법이 있다면이제한 SQL

+-----------+------+ 
| Timestamp | Size | 
+-----------+------+ 
| 1-1-13 + 10.3 + 
+-----------+------+ 
| 1-3-13 + 6.7 + 
+-----------+------+ 
| 1-5-13 + 3.0 + 
+-----------+------+ 
| 1-9-13 + 11.4 + 
+-----------+------+ 

같은 테이블 설정이 내가 궁금하네요이

SELECT * FROM table ORDER BY timestamp ASC LIMIT BY (SUM(size) <= 20.0);

이는 제 3 행의 크기의 합이 단 (20)이기 때문에, 항상 종종 첫 번째 행 수도 20. 동일 3 행되지 않을 수도 처음 세 열의 잡아해야 20의 값을 가지며,이 경우 첫 번째 값만 잡아야합니다.

나는 쿼리가 실행 된 후 PHP에서 합계를 신속하게 계산할 수 있음을 이미 알고 있지만 MySQL로이를 수행하려고합니다.

+0

그래서 당신이 실행중인 총 싶어? –

+0

ANSI SQL에서 EVERY SINGLE ROW 출력에 일치하는 기준에 따라 일부 테이블 (관계)의 행을 선택합니다. 귀하의 예에서, 기준은 모든 새로운 행마다 변경됩니다. 확실하지는 않지만 PL/SQL 기능이 필요하다고 생각합니다. ORDER가 작동하는 방식에 유의하십시오. 하위 쿼리를 사용하는 경우 출력 결과를 정렬할지 또는 입력 조건을 일치 시킬지에 따라 결과가 달라지며 ORDER는 이와 같이 사용되지 않아야합니다. LIMIT (또는 OFFSET)은 표현식이 아닌 출력의 단순한 제한 행 수에 사용되는 것으로 가정됩니다. –

답변

3

당신은 그 기반으로 누적 합계 및 제한을 추가하려면, 다음과 같은 작업을해야합니다 :

SET @runtot:=0; 
SELECT 
    q1.t, 
    q1.s, 
    (@runtot := @runtot + q1.s) AS rt 
FROM 
    (SELECT Date AS t, 
    SIZE AS s 
    FROM Table1 
    ORDER BY Date 
    ) AS q1 
WHERE @runtot + q1.s <= 20 

편집 : 여기 데모 - SQL Fiddle

+0

약간의 연구가 끝나면 정말로 옳습니다. 누적 합계를 계산하면 합류보다 효과적입니다. 답변 해주셔서 감사합니다! – garetmckinley

4
SELECT * FROM ints ORDER BY i; 
+---+ 
| i | 
+---+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 

SELECT x.* ,SUM(y.i) FROM ints x JOIN ints y ON y.i <= x.i GROUP BY x.i; 
+---+----------+ 
| i | SUM(y.i) | 
+---+----------+ 
| 0 |  0 | 
| 1 |  1 | 
| 2 |  3 | 
| 3 |  6 | 
| 4 |  10 | 
| 5 |  15 | 
| 6 |  21 | 
| 7 |  28 | 
| 8 |  36 | 
| 9 |  45 | 
+---+----------+ 

SELECT x.* ,SUM(y.i) FROM ints x JOIN ints y ON y.i <= x.i GROUP BY x.i HAVING SUM(y.i) <= 20; 
+---+----------+ 
| i | SUM(y.i) | 
+---+----------+ 
| 0 |  0 | 
| 1 |  1 | 
| 2 |  3 | 
| 3 |  6 | 
| 4 |  10 | 
| 5 |  15 | 
+---+----------+ 
+0

하위 쿼리로 문제를 해결하려고했는데 조인이 더 좋고 읽기 쉽습니다. +1 – Marcassin

+0

와우, 훌륭한 대답. 이 작업을 수행 할 때 성능 문제가 있습니까? – garetmckinley

+0

변수에 의한 누적 합계는 자체 JOIN의 오버 헤드를 저장합니다. –