powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / выборка последних 200 записей
13 сообщений из 13, страница 1 из 1
выборка последних 200 записей
    #32425555
MaximZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Захотелось мне выбирать последнии 200 записей, написал запрос:

select * from table1 limit 200 offset ((select count(*) from table1)-200)

не хочет падла работать. А как можно это по другому?
...
Рейтинг: 0 / 0
выборка последних 200 записей
    #32425845
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дядь, а как определяешь какие записи последние?
...
Рейтинг: 0 / 0
выборка последних 200 записей
    #32425872
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будешь смеяться, но даже такое не понимает:

select * from tree limit (50 + 50) offset 100


похоже придется определять вычисляемое значение, шить строку, и загонять ее в EXECUTE. Дроп ее Ять.

2Genady: ну, если бы конструкция работала, дописать ORDER BY не проблема.
...
Рейтинг: 0 / 0
выборка последних 200 записей
    #32425929
VVlаdimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а если планируется Order by ЗАЧЕМ делать offset?
...
Рейтинг: 0 / 0
выборка последних 200 записей
    #32426048
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну, если бы конструкция работала, дописать ORDER BY не проблема.

без Order by воопрос вообще не имеет смысла. :)
...
Рейтинг: 0 / 0
выборка последних 200 записей
    #32426445
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замените выражение в order by на противоположное (возможно, с помощью desc) и используйте limit 200 (offset 0).
...
Рейтинг: 0 / 0
выборка последних 200 записей
    #32426486
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 LeXa NalBat

оно понятно, но вопрос о передаче в инструкции LIMIT или OFFSET _вычисляемых_ значений все ж таки может рассматриваться как таковой. (не применительно к текущему вопросу). И вот тут будет засада :0)
...
Рейтинг: 0 / 0
выборка последних 200 записей
    #32426513
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 assa

Я для этого использовал динамическое формирование запроса и выполнение его через execute.
Если кому интересно могу выложить код функции, которая считает количество страниц в указанном запросе и номер страницы на которой находится заданный айдишник. :)
...
Рейтинг: 0 / 0
выборка последних 200 записей
    #32426794
MaximZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мдаа, а я думал решение есть.
Для особенно любящих точность, последние 200 записей можно считать на время начала запроса.

Но вообще зря там нельзя подставить запрос. Думаю что никто не обидится если будет такая возможность. Тем более что тема актуальна, а решение существет не в самой удобной форме. И к тому же не безопасной.
...
Рейтинг: 0 / 0
выборка последних 200 записей
    #32426943
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2MaximZ : конкретно вашу задачу решает предложение LeXa NalBat . Если нужно вернуть "нормальный порядок - проинвертируйте результат сортировки еще раз:

SElECT * FROM (select * from table order by id desc limit 200 offset 200) as last_t ORDER BY id;

что такое "порядок на момент начала"? Считается, что порядок вывода записей в реляционных бд заведомо не определен (произволен), если не навязан инструкцией ORDER BY предложения SELECT.

2Genady - о том и речь. А жальльль :0) Могли бы и реализовать разбор c учетом возможности подстановки выражения вместо константы.
...
Рейтинг: 0 / 0
выборка последних 200 записей
    #32429849
Shweik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно откуда такие проблемы..... Мне почему-то кажется что все эти
проблемы относятся к версям до 7.3.
Вот вариант выдачу "последних" записей:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
tst=# select * from workers order by rid;                 
 rid | uid |   opdate   | opcode                          
 -----+-----+------------+--------                         
 
    1  |    1  |  2003 - 01 - 08  |     200                           
    2  |    1  |  2002 - 07 - 04  |       2                           
    3  |    1  |  2001 - 09 - 17  |       3                           
    4  |    1  |  2001 - 11 - 24  |       5                           
    5  |    2  |  2004 - 01 - 11  |       2                           
    6  |    1  |  2002 - 01 - 26  |       4                           
    7  |    1  |  2001 - 09 - 07  |       1                           
    8  |    1  |  2003 - 01 - 08  |      10                           
    9  |    2  |  2002 - 04 - 13  |      10                           
   10  |    2  |  2001 - 10 - 05  |       1                           
   11  |    2  |  2003 - 01 - 08  |     200                           
   12  |    2  |  2002 - 10 - 21  |       5                           
   13  |    2  |  2003 - 01 - 08  |       7                           
   14  |    2  |  2003 - 01 - 08  |       8                           
(записей:  14 )                               
tst=# select * from workers order by rid limit cnt2() offset cnt2()- 3 ;         
 rid | uid |   opdate   | opcode                                               
 -----+-----+------------+--------                                              
 
   12  |    2  |  2002 - 10 - 21  |       5                                                
   13  |    2  |  2003 - 01 - 08  |       7                                                
   14  |    2  |  2003 - 01 - 08  |       8                                                
(записей:  3 )                                                                   
 --Функция cnt2() 
 
tst=#  create function cnt2() returns bigint as 'select count(*) from workers ' 
 LANGUAGE sql;

Ну и еще примерчик....
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
tst=# select * from workers order by rid limit cnt2() offset cnt2()- 2 ;         
 rid | uid |   opdate   | opcode                                               
 -----+-----+------------+--------                                              
 
   13  |    2  |  2003 - 01 - 08  |       7                                                
   14  |    2  |  2003 - 01 - 08  |       8                                                
(записей:  2 )                                                                   

Да - чуть не забыл :
Код: plaintext
1.
2.
3.
4.
5.
6.
tst=# select version();                                                      
                              version                                        
 -------------------------------------------------------------------          
 
 PostgreSQL  7 . 4  on i386-unknown-freebsd4. 4 , compiled by GCC  2 . 95 . 3            
( 1  запись)                                                                   

Так что думаю тема исчерпана. Вычисляемые выражения допустимы в
параметрах limit и offset - просто запросы ту да нужно подставлять именно как функиции. И нет никакой необходимости в EXECUTE.
...
Рейтинг: 0 / 0
выборка последних 200 записей
    #32429930
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторпроблемы относятся к версям до 7.3.
по 7.3.3 включительно

авторИ нет никакой необходимости в EXECUTE.

"Это радовает нас"
...
Рейтинг: 0 / 0
выборка последних 200 записей
    #32430196
Shweik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обратимся к первоисточникам 8-) Вот что написано в файле доки release.html#RELEASE-7-4:
................
*
Allow expressions to be used in LIMIT/OFFSET (Tom)
In prior releases, LIMIT/OFFSET could only use constants, not expressions.
Однако подзапросы пока что парсер тут не пропускает:
ERROR: argument of LIMIT must not contain subqueries
Придется делать их в функциях до следующего релиза. ;)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / выборка последних 200 записей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]