@W1zzyy
Backend developer

Как выбирать последующие записи в SQL?

Здравсвуйте господа! Мне надо выбирать записи из бд поочередно, то есть при условном ивенте выбрать первые 5 записей, при следующем ивенте выбрать уже с 5 по 10 и тд и тп. Как сделать это не через кастыль?
  • Вопрос задан
  • 145 просмотров
Решения вопроса 1
bingo347
@bingo347
Crazy on performance...
Помимо описанных в других ответах LIMIT и OFFSET есть еще такая вещь как курсор.
Курсор позволяет читать строки по одной, но требует открытого соединения с СУБД.
На самом деле большинство СУБД в ответ на запрос возвращают именно курсор, просто функции из библиотеки, которая работает с СУБД, вычитывают курсор до конца, если смысл таких функций вернуть массив строк из результата запроса.
Курсор штука ленивая, то есть поиск следующей строки СУБД будет делать только в тот момент, когда у нее попросят следующую строку для курсора.
В случае если у нас есть постоянный коннект к СУБД, вариант запросить сразу все и потом дергать курсор понемногу будет работать быстрее чем множество запросов с LIMIT, так как СУБД будет лишь единожды анализировать запрос, подбирать подходящие для него индексы и т.д.

То есть в Вашем случае нужно сначала понять, можно ли гарантированно поддерживать коннект к СУБД между ивентами.
Если да, то отправляете в СУБД запрос и получаете курсор перед подпиской на ивент, а в хендлере самого ивента уже дергаете курсор по 5 раз.
Если нет, то на каждый ивент отправляете запрос с LIMIT и OFFSET.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
rozhnev
@rozhnev Куратор тега SQL
Fullstack programmer, DBA, медленно, дорого
Для таких целей оспользуют LIMIT например в MySQL

select * from activity order by id asc limit 0, 3;

select * from activity order by id asc limit 3, 3;


run sql online


В других базах данных синтаксис может отличаться
Ответ написан
Комментировать
@mayton2019
Bigdata Engineer
Нужно помнить о том что между вычитыванием 1-й и 2-й страницы таблица могла быть изменена. И процесс может либо пропустить какую-то строку либо прочитать дубликат. У этой проблемы есть много решений. Почти все они лежат в плоскости транзакций. Но поскольку тема тегирована только SQL - то непонятно с какой dbms мы имеем дело. Реализация режимов транзакций - вещь крайне нестандартизированная.

Тоесть чтобы обсуждать правильный pagination нам нужно понять что по ту сторону application. Oracle? MSSQL? e.t.c.
Ответ написан
Комментировать
dimonchik2013
@dimonchik2013
non progredi est regredi
счетчиком

select * where id > твоего счетчика limit 5

счетчик писать отдельно / держать в куках и т.п.
Ответ написан
Комментировать
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
в пхп передаются параметры прошлого запроса (пофиг как, через куки, гет запросом, божественным откровением или сессионной переменной - не суть), а пых вычисляет новое смещение и передает его в запрос вида limit 10, 5 (про лимиты читать в доке)
Ответ написан
DollyPapper
@DollyPapper
Использовать ОРМ где это реализовано не через костыль. За не имением ОРМ хорошим вариантом как уже предложил Дмитрий Беляев использовать курсоры
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы