Как в sql запросе вычесть следующие id*n от другого id?

Столкнулся с тем, что не могу найти решения из коробки в MySQL, для поиска следующего id в таблице, когда

new id = max(id) - onPage*pageNum
onpage = 20; // постоянное значение
pageNum = $_GET['page']; // число, например, 2,3,4...100 и т.д.

Задача: Сделать постраничную навигацию, без использования offset в sql запросе. Как я понял, есть популярное решение, когда мы работаем только с where id < id, который мы должны найти.

Дано: Например таблица people, вида

create table persons (
id int not null auto_increment,
name varchar,
phone varchar,
primary key(id)
)

Что пробовал:

  1. Делаю запрос, чтобы найти максимальный id.
select id 
from persons 
order by id desc 
limit 1

Сейчас я знаю максимальный id.

Например, этот id = 543.

Задача: Как теперь найти ID, который равен 543 - 20 = 523 ?

Проблема: Нужно вычесть реальные записи, то есть, какие-то id могут быть удалены из таблицы. Собственно, в этом и проблема. Я правильно понимаю, что в MySQL нельзя просто получить такой id?

Хотелось бы в итоге получить такой id и получить запрос вида:

select id 
from persons 
where id < 523
order by id desc 
limit 20

Спасибо.


Ответы (1 шт):

Автор решения: Aziz Umarov

Если у вас не полные ID т.е. отсутствует записи в таблице, то нужно пронумеровать с начала используя оконные функции и уже имея непрерывный rowNumber работать с ним.

 select * from personsWithNumber
 where rowNumber between pageNumber*20 and (pageNumber+1)*20
→ Ссылка