Получить последние N строк в базе данных по порядку? - PullRequest
43 голосов
/ 08 апреля 2010

Допустим, у меня есть следующая таблица базы данных:

 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;

Так как мне это сделать?

Ответы [ 2 ]

73 голосов
/ 08 апреля 2010

Почему бы вам просто не заказать обратный путь?

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;

... это довольно дешевая операция.

11 голосов
/ 15 июня 2011

Это должно работать:

WITH t AS (
    SELECT * FROM mytable ORDER BY record_date DESC LIMIT 5
)
SELECT * FROM t ORDER BY record_date ASC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...