@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, не подходит. Ведь записи будут дублироваться.
  • Вопрос задан
  • 63 просмотра
Пригласить эксперта
Ответы на вопрос 4
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
Какой то непонятный вопрос, точнее странный способ выбирать следующие N постов. Способ сортировки НИКАК не влияет на следующие 10, точнее это не ваша забота. В случае апи я указываю метод сортировки и страницу, так как апи НЕ ЗНАЕТ где и как я остановился, к нему приходит запрос "отдать страницу 4 с сортировкой по рейтингу", что должно вызвать у вас sql
SELECT * FROM `posts` 
WHERE 1 
ORDER BY `rating` DESC 
LIMIT 40,10

Все, результат отдать пользователю. Если следующим запросом к апи будет 5 страница с сортировкой по дате - отдаете 5 страницу с сортировкой по дате.

UPD:
Все по порядку как положено (AUTO INCREMENT)
и тут посты с ид 5 и 12 удаляются, и - опа, не по порядку (
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Если у вас произвольная сортировка, то на id вообще нельзя полагаться. С чего вы взяли, что при сортировке, например, по рейтингу, на первую страницу попадут записи с id от 1 до 10? Это могут быть id 27, 31, 105, ..., 7, 12. И никакого условия по id вы не придумаете.
Мало того, пока пользователь просматривает страницу, рейтинги могут поменяться. Если вы продолжите выдачу по списку id, то пользователь получит уже неправильно отсортированные данные.
Общего решения этой задачи не существует, приходится либо выводить записи только в хронологическом порядке, либо использовать произвольную сортировку и мириться с возможным пропуском и/или дублированием записей на разных страницах.
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
Передавайте не id_last_element, а номер страницы.
Ответ написан
@ar2rsoft
PHP-developer
При первом запросе запоминать минимальное/максимальное значение поля по которому сортируется, в зависимости от направления сортировки, и при втором запросе его учитывать.

SELECT * FROM posts WHERE id > 20 ORDER BY id DESC LIMIT 10 OFFSET 10


И соответственно условие меняется в зависимости от сортировки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы