2010-04-08 33 views
29

比方說,我有以下的數據庫表:按順序獲取數據庫中的最後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 

我想抓住最後的5列由record_date ASC排序的數據。這是容易做到:

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 2010-04-08 02:28:33

+1

@Travis第二個查詢給出了一個錯誤。在ORDER BY – 2014-03-10 04:52:53

+1

@AndyStowAway之前,嵌套查詢後面必須跟一個AS [query_name]語句:這可能是您實現的限制。我確信匿名子查詢是可以的(我知道他們在Postres和MySQL中工作)。 – 2014-03-31 23:27:51

9

這應該工作:

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

是的,這是翻轉的很好補充。謝謝! – zerocog 2017-01-09 23:02:10

相關問題