Всем привет! Пишу API и появилась такая задача...
Предположим в базе лежит 30 постов, с ID равным от 1 до 30. Все по порядку как положено (AUTO INCREMENT)
Запрашиваются список постов, получили 10 первых постов, затем приложение, для получения следующих 10 постов делает запрос с указанием ID последней известной записи. В нашем случае id_last_element=10.
По идее, сервер проверяет, если присутствует id то добавляем к запросу условие. В нашем случае получаем запрос:
SELECT * FROM posts WHERE id < 10 ORDER BY id DESC LIMIT 10
Все хорошо, но что если появляется возможность сортировки? Мы не знаем какие условия сортировки выберет пользователь. Это может быть дата, может быть DESC или ASC, может быть количество просомтров, рейтинг, количество лайков и т.д. Но везде нужно добавитьWHERE id
< 10, или WHERE id
> 10. И все это в зависимости от указанной сортировки DESC или ASC.
Поэтому, на стороне PHP приходится создавать кучу условий на каждую возможную сортировку и присутствие параметра id_last_element.
т.е. суть вопроса в том, как эффективней заставить Mysql выбрать данные учитывая сортировку, но отбрасывая все ID, которые были выведены до указанного?
Сразу оговорюсь, что LIMIT 10, 10 не подходит. Потому что посты постоянно добавляются, а значит отсчет от первого, что и делает offset в limit, не подходит. Ведь записи будут дублироваться.