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

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

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

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


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

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

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

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

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

Но вообще зря там нельзя подставить запрос. Думаю что никто не обидится если будет такая возможность. Тем более что тема актуальна, а решение существет не в самой удобной форме. И к тому же не безопасной.
...
Рейтинг: 0 / 0
01.03.2004, 18:23
    #32426943
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выборка последних 200 записей
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
03.03.2004, 16:35
    #32429849
Shweik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выборка последних 200 записей
Интересно откуда такие проблемы..... Мне почему-то кажется что все эти
проблемы относятся к версям до 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
03.03.2004, 17:13
    #32429930
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выборка последних 200 записей
авторпроблемы относятся к версям до 7.3.
по 7.3.3 включительно

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

"Это радовает нас"
...
Рейтинг: 0 / 0
03.03.2004, 19:33
    #32430196
Shweik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
выборка последних 200 записей
Обратимся к первоисточникам 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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / выборка последних 200 записей / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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