Короткий ответ
Нужно отсортировать результат по стабильному критерию и использовать LIMIT 20 OFFSET 20, где OFFSET пропускает первые 20 строк, а LIMIT возвращает следующие 20.
Как это работает подробнее
OFFSET n указывает СУБД пропустить первые n строк отсортированного результата перед тем, как начать отдавать строки согласно LIMIT. Без явного и однозначного ORDER BY порядок строк не гарантирован, а значит «страницы» могут перекрываться или задваиваться между запросами.
Пример кода
Запрос SQL
SELECT customer_id, full_name
FROM customers
ORDER BY customer_id
LIMIT 20 OFFSET 20;Что использовать на практике
- На практике: постраничный вывод обязательно нужно сортировать по уникальному или хотя бы детерминированному ключу (например,
customer_id), иначе при наличии одинаковых значений в сортируемом столбце строки могут «перетасоваться» между вызовами, и часть клиентов будет показана два раза или не показана вовсе. - Результат: Результат — клиенты с 21-го по 40-й в порядке возрастания customer_id.
- Проверка: первая строка этой «страницы» должна совпадать с 21-й строкой полного списка, отсортированного тем же образом.
Подводные камни
- Частая ошибка: сортируют только по неуникальному полю (например, по дате регистрации без вторичного критерия) — тогда при одинаковых датах порядок внутри группы не гарантирован, и постраничная навигация становится нестабильной; также
OFFSETна больших таблицах может быть неожиданно медленным, так как СУБД фактически вычисляет и отбрасывает все предыдущие строки.