Offset в sql запросе

turik97

здравствуйте, на моем сайте когда скролл прокручен вниз, прогружаються новости, запросу передается параметр offset (текущее количество div'ов с новостями) и в конце запросе идет параметр DESC LIMIT {offset} 25, тоесть пропускаем количество уже загруженных новостей, и лимит на колво выбранных новостей 25, но есть проблема в том что пока я листаю новости определенного пользователя, если он добавит в это время новую то как бы порядок его новостей смещается, поэтому если во время прогрузки он добавит новость то порядок сместится на 1 вперед и при запросе я получу показанную ранее новость, тоесть оффсет идет с 25ой новости, человек в это время добавил 2 новости, и получается в бд старые 24 и 25 новости которые уже прогруженны становятся 26 и 27 и подгружаются ещё раз, что можно предпринять в данной ситуации?

1 ответ

turik97

Не использовать offset. Зачем вам offset? Мало того, что есть описанная проблема, так ещё его невозможно реализовать быстро на больших значениях offset. Потому что offset вычитывает offset + limit записей из выборки лишь затем, чтобы первые offset записей выкинуть.

При загрузке следующей порции данных передавайте идентификатор последней показанной пользователю. Например, если у вас записи показываются вот с такой сортировкой:

select ... from tablename where ... order by created_at, id limit 25

То для загрузки следующих элементов списка передайте значения created_at и id и запросите продолжение списка начиная сразу после этой строки:

select ... from tablename where ...
    and created_at >= :lastrowdate
    and id > :lastrowid
order by created_at, id limit 25

licensed under cc by-sa 3.0 with attribution.