Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Web > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 29.12.2019, 17:12   #1
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 122
По умолчанию Получение набора записей по курсору

СУБД Postgresql есть таблица с городами и странами.

Код:
CREATE TABLE T (
  id INTEGER,
  town_country VARCHAR (255),
  is_country bool
) ;--DEFAULT CHARSET=utf8 ;

INSERT INTO T
  (id, town_country, is_country)
VALUES
  (1, 'Франция', true),
  (2, 'Германия', true),
  (4, 'Россия',  true),
  (5, 'Канада', true),
  (6, 'Бельгия',  true),
  (7, 'Беларусь', true),
  (8, 'Австралия', true),
  (9, 'Япония', true),
  (10, 'Афины', null),
  (11, 'Брюссель', null),
  (12, 'Барселона', null)
Отсортированный список
Код:
SELECT *
FROM T
ORDER BY
 is_country DESC NULLS LAST, 
 town_country ASC NULLS FIRST
Австралия
Беларусь
Бельгия
Германия
Канада
Россия
Франция
Япония
Афины
Брюссель
Барселона

Нужно написать несколько запросов, которые возвращают по 5 записей из этого списка.
Начиная со 2 запроса, нужно в условие запроса передать
последнюю запись, найденную в предыдущем запросе.


Первый запрос без условия:
Код:
SELECT *
FROM T
ORDER BY
 is_country DESC NULLS LAST, 
 town_country ASC NULLS FIRST
LIMIT 5
Получаем набор, все ОК:
Австралия
Беларусь
Бельгия
Германия
Канада

https://www.db-fiddle.com/f/SpTXQTSprkMr3syfk6DSE/0


Берем последнюю запись - Канада, нужно получить следующие 5 записей, которые
находятся в списке под Канадой, например так

Второй запрос:
Код:
SELECT *
FROM T
where town_country > 'Канада'
ORDER BY
 is_country DESC NULLS LAST, 
 town_country ASC NULLS FIRST
 LIMIT 5
https://www.db-fiddle.com/f/39cbZdNmr4HzVzsS1mnfxy/0

Проблема: возвращается только 3 записи (Россия, Франция, Япония), из-за использования сортировки
is_country DESC NULLS LAST

Третим запросом нужно вернуть одну запись:
Барселона


Как правильно написать 2 и 3 запросы, оставив такую сортировку,
во втором запросе нужно использовать последнюю запись из 1 запроса,
в 3 запросе нужно использовать последнюю запись из 2 запроса?

Последний раз редактировалось polin11; 29.12.2019 в 17:40.
polin11 вне форума Ответить с цитированием
Старый 29.12.2019, 19:46   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,010
По умолчанию

https://postgrespro.ru/docs/postgres.../queries-limit
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 30.12.2019, 00:17   #3
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 122
По умолчанию

Попробую понятней описать проблему:

1) При первом вызове метода не передают параметр - курсор, метод возвращает 5 записей:
Австралия
Беларусь
Бельгия
Германия
Канада

2) При следующем вызове метода передают последнюю запись - курсор из пред. вызова (Канада), мне нужно вернуть следующие 5 записей из списка, находящиеся под курсором. Я не знаю второй это вызов, третий или четвертый. У меня просто есть запись - курсор (последняя запись из пред. вызова)

Вопрос как написать такие запросы, чтобы по частям вернуть весь список в нужной сортировке (сначала страны, потом города)?
polin11 вне форума Ответить с цитированием
Старый 30.12.2019, 19:26   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,010
По умолчанию

кроме ограничения сколько (Limit) есть еще и с какой по счету (в указанном порядке) делать выбор.
другими словами сколько "первых" записей пропускать. В вашем случае 5, потом 10 и т.д.
при большом желании(если не хотите запоминать) это число можно возвращать(передавать) в каждом запросе.
И это слово (для postgree) есть на указанной странице.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выделение набора записей CAHDEP Microsoft Office Access 0 26.01.2018 19:01
Получение определённого диапазона номеров записей БалаШагаЛ SQL, базы данных 1 08.08.2013 18:38
TPlanner, получение количество записей b4dm4n Компоненты Delphi 3 11.10.2011 14:13
Ближайшая точка к курсору Claster Помощь студентам 11 27.07.2011 17:29
Обновление набора данных после добавления в таблицу записей "внешней" программой dimmm БД в Delphi 5 21.04.2009 00:56


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS