2010-04-08 4 views
29

의 나는 다음과 같은 데이터베이스 테이블이 있다고 가정 해 봅시다 : 나는 record_date의 ASC에 의해 주문 데이터와 지난 5 개 행을 잡아하려는데이터베이스에서 마지막 N 개의 행을 순서대로 가져 옵니까?

record_id | record_date | record_value 
-----------+-------------+-------------- 
     1 | 2010-05-01 |  195.00 
     2 | 2010-07-01 |  185.00 
     3 | 2010-09-01 |  175.00 
     4 | 2010-05-01 |  189.00 
     5 | 2010-06-01 |  185.00 
     6 | 2010-07-01 |  180.00 
     7 | 2010-08-01 |  175.00 
     8 | 2010-09-01 |  170.00 
     9 | 2010-10-01 |  165.00 

. 이것은을 쉽게 수행 할 수 있습니다 :

SELECT * FROM mytable ORDER BY record_date ASC LIMIT 5 OFFSET 4 

내게 줄 것이다 :

record_id | record_date | record_value 
-----------+-------------+-------------- 
     6 | 2010-07-01 |  180.00 
     7 | 2010-08-01 |  175.00 
     3 | 2010-09-01 |  175.00 
     8 | 2010-09-01 |  170.00 
     9 | 2010-10-01 |  165.00 

을하지만 이렇게 어떻게 내가 얼마나 많은 기록을 모르고 마법을 계산할 수없는 경우 4의 숫자?

나는이 쿼리를 시도했지만, 5 개 미만의 레코드가있는 경우, 그것은 잘못된 오프셋 부정적 결과 :

SELECT * FROM mytable ORDER BY record_date ASC LIMIT 5 
    OFFSET (SELECT COUNT(*) FROM mytable) - 5; 

그래서 나는이 방법을 수행합니까?

답변

58

반대 주문 하시겠습니까?

SELECT * FROM mytable ORDER BY record_date DESC LIMIT 5; 

응용 프로그램에서 제대로 다시 플립하지 않으려면, 당신은 둥지 쿼리를 할 수 있고 그들을 두 번 플립 : 밝혀

SELECT * 
    FROM (SELECT * FROM mytable ORDER BY record_date DESC LIMIT 5) 
    ORDER BY record_date ASC; 

이 ... 꽤 싼 작업으로 .

+1

을 : 나는 응용 프로그램에서 정렬하고 싶지 않기 때문에. 두 번째 쿼리의 경우 : 완벽하게 작동하지만 내 DAL에 적합하지 않습니다. 오 잘. 감사! – Kristopher

+1

@Travis Second 쿼리에서 오류가 발생합니다. 중첩 된 쿼리 뒤에는 AS [query_name] 문이 와야합니다. ORDER BY –

+1

@AndyStowAway : 이는 구현의 한계 일 수 있습니다. 나는 익명의 서브 쿼리가 괜찮다고 확신한다 (Postres와 MySQL에서 작동한다는 것을 알고있다). –

9

이 작동합니다 : 첫 번째 쿼리

WITH t AS (
    SELECT * FROM mytable ORDER BY record_date DESC LIMIT 5 
) 
SELECT * FROM t ORDER BY record_date ASC; 
+0

예, 이것은 뒤집기에 좋은 보완책입니다. 감사! – zerocog

관련 문제