Задать вопрос
@Alk90
php, mysql, jquery, css, html, api

Как правильно выполнить зарос, начиная с указанного ID элемента?

Всем привет! Пишу 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, не подходит. Ведь записи будут дублироваться.
  • Вопрос задан
  • 64 просмотра
Подписаться 1 Простой Комментировать
Ответ пользователя Rsa97 К ответам на вопрос (4)
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Если у вас произвольная сортировка, то на id вообще нельзя полагаться. С чего вы взяли, что при сортировке, например, по рейтингу, на первую страницу попадут записи с id от 1 до 10? Это могут быть id 27, 31, 105, ..., 7, 12. И никакого условия по id вы не придумаете.
Мало того, пока пользователь просматривает страницу, рейтинги могут поменяться. Если вы продолжите выдачу по списку id, то пользователь получит уже неправильно отсортированные данные.
Общего решения этой задачи не существует, приходится либо выводить записи только в хронологическом порядке, либо использовать произвольную сортировку и мириться с возможным пропуском и/или дублированием записей на разных страницах.
Ответ написан
Комментировать