veydlin
@veydlin
Мне никогда не жалко средств на свое любопытство

Как подгружать новости не в хронологическом порядке?

На сайте есть лента новостей, пока юзер листает первые 10 новостей, в БД могут быть добавлены ещё несколько новых или удалены некоторые их тех, что щас смотрит юзер

Так же есть режим просмотра по рейтингу, где рейтинг может быть от 0 до 5, разумеется при таком раскладе хронология вывода портится, и уже нельзя опираться на последний ID новости при подгрузке новых (WHERE `id` > бла_бла)

Запрос выглядит как-то так:
SELECT *, (хитрая формула расчета рейтинга) as rating FROM `news`
WHERE (некое условие для дополнительной сортировки по категориям)
ORDER BY `rating` ASC
LIMIT 20


Как тогда подгружать новые новости?
  • Вопрос задан
  • 340 просмотров
Решения вопроса 1
@MadridianFox
Web-программист, многостаночник
Просто используйте постраничную навигацию:
SELECT *, something FROM `news`
WHERE (некое условие для фильтрации по категориям) AND  date < "time of page hit"
ORDER BY `something` ASC
LIMIT 20, 20

Я добавил в этот запрос всего два маленьких изменения. Первое - задал смещение для LIMIT, его надо высчитывать на PHP и вставлять в запрос. Первая цифра это просто номер страницы минус один, умноженное на количество постов на странице (page_num-1)*page_size. Вторая цифра - как обычно, количество постов на странице.
Второе измененеие - добавил в where дополнительное условие: выбирать только те новости, которые уже были в базе, пользователь открыл страницу. Это необходимо, т.к. если в процессе подгрузки новостей добавится ещё одна, то страницы поедут (вы могли замечать это, когда листаете хабр и на следующей странице первым виден последний пост с предыдущей) и какая-то новость задублируется в общем списке на клиенте. Time of page hit должно храниться на клиенте и передаваться на сервер при подгрузке каждой следующей порции данных.

Этот метод не зависит от того как вы сортируете новости - по дате, рейтингу, любому другому полю... главное чтобы первая подргузка и все последующие сортировались одинаково.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@d-stream
Готовые решения - не подаю, но...
определится для себя что же важнее, что менее важно и указать это через запятую в order by

p.s. where - это не сортировка, а отбор
Ответ написан
Комментировать
romy4
@romy4
Exception handler
Почему бы не использовать вывод по дате добавления/публикации?
Ответ написан
Ваш ответ на вопрос

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

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