@priveted

Правильная подгрузка контента HTML, JS, PHP, MYSQL с учетом добавления и удаления строк. Как реализовать?

Всем привет! Написал небольшой новостной движок и подгрузку контента (записей) через ajax. После написания, столкнулся с проблемой "не правильной" подгрузки последующих таблиц, т.е если открыта страница к примеру с 6 записями, нажав на кнопку "Показать еще" открываются следующие 6 записей (они работают как надо), но например если до момента нажатия на кнопку "Показать еще" добавляются новые или восстанавливаются из корзины к примеру старые в начале, то правильный офсет сбивается и показывает либо лишние строки таблицы, либо наоборот, более старые - если запись восстановлена вначале таблицы до уже выведенного списка. Интересует правильный MySQL-запрос. Пробовал следующее:

$limit = $limit + 6`
$sql = 'SELECT * FROM posts ORDER BY post_id ASC LIMIT {$limit},6';


Или

$offset = $offset + 6
$sql = 'SELECT * FROM posts ORDER BY post_id ASC LIMIT 6 OFFSET {$offset}';


Пробовал так же на основе последнего идентификатора:
$last_id = $_POST['last_id'];
$sql = 'SELECT * FROM posts WHERE post_id > {$last_id} ORDER BY post_id ASC LIMIT 6';


Но на данном этапе сталкивался с проблемой порядка сортировки, т.к присутствуют записи с сортировкой не по идентификатору, а по дате или другой ячейке с данными сортировки по типу post_sort.

Была так же не очень хорошая идея с подсчетом изменения общего количества:
$offset = $offset + 6;
$old_count = $_POST['old_count'];
$count = 'SELECT COUNT(*) AS num FROM posts';

if($count > $old_count)
    $offset = ($count - $old_count) + $offset;
elseif($count < $old_count)
     $offset = $offset - ($old_count - $count);

$sql = 'SELECT * FROM posts ORDER BY post_id ASC LIMIT 6 OFFSET {$offset}';


Но данный метод позволяет рассчитать правильно только до уже выведенных записей, если записи добавлены в конец то тут снова выводятся лишнее.

На примере таблицы
62cedde109f55473852905.png

Выведет 7,6,9,10,11,12 минуя 6. А если 1 запись будет к примеру восстановлена после загрузки страницы то получим 6,7...

Есть ли такая возможность что бы это правильно рассчитывалось?
  • Вопрос задан
  • 131 просмотр
Решения вопроса 1
@priveted Автор вопроса
Может кому пригодиться.
Успешным решением текущей задачи в моем случае является использование композитных индексов (?, ?) >< (? ?) с использованием последних выведенных значений даты и идентификатора.

Стартовый запроc:

SELECT * FROM posts LIMIT 2

Повторный, к примеру запросом через ajax:
SELECT * FROM posts WHERE (post_date, post_id) > (22-01-01,  2) LIMIT 2
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
iMedved2009
@iMedved2009
Не люблю людей
Возможность то конечно есть. Вы должны где то хранить что вы показали пользователю и исходя из этого делать запрос или вывод. Вопрос только в том - зачем? Вы на это потратите кучу ресурсов, а по факту выгоды из этого ноль.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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