php sqlite pagination эффективный способ перейти на предыдущую / следующую страницу - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть веб-приложение PHP (5.5) с sqlite 3. На нем есть страница журналов (возможно, от 10 000 до 100 000 журналов в будущем). Я использую этот способ подкачки для этих журналов. Запрос для sqlite я использую:

SELECT *
FROM Logs
WHERE date > [input epoch long]
ORDER BY date DESC
LIMIT 100;

Модель бревен похожа на:

"id": [int increased by sqlite]
"date":[entry date, epoch long like: "1533595828"]
+ other not relevant data for this issue

В идеале я хочу иметь страницу Нравится: Предыдущая | 1 | 2 | 3 | 4 | Далее это швы довольно тяжело. Поэтому обработка страниц «Предыдущая» и «Следующая» приемлема.

Для обработки следующей страницы я использую: date> [последняя запись, которую он возвратил при init]. Это работает. Буду возвращаться, мне нужно следить за первым свиданием. После того, как я возвращаюсь несколько раз, это становится грязным.

Как лучше всего решить эту проблему?

1 Ответ

0 голосов
/ 01 сентября 2018

Никто не захочет пролистывать тысячи страниц; Ваше веб-приложение может быть улучшено за счет улучшения поиска и фильтрации.

В любом случае, если вы хотите узнать, сколько страниц, вам нужно сосчитать все строки:

SELECT count(*) FROM Logs;

И если вы хотите узнать, на какой странице вы находитесь, вам нужно посчитать, сколько строк перед текущей:

SELECT count(*) FROM Logs WHERE date < [first on current page];

Функции «next» и «previous» работают совершенно противоположно друг другу: вам нужно отслеживать последнюю / первую строку текущей страницы, и вы должны выбрать следующие 100 строк с большей / меньшее значение:

SELECT *                              SELECT *
FROM Logs                             FROM Logs
WHERE date > [last on current page]   WHERE date < [first on current page]
ORDER BY date DESC                    ORDER BY date ASC
LIMIT 100;                            LIMIT 100;

(У второго запроса есть интересная складка возврата строк в обратном порядке, но это не должно быть проблемой.)

И если вы хотите перейти на определенную страницу, самый простой способ узнать первое значение даты на этой странице - это OFFSET:

SELECT date
FROM Logs
ORDER BY date ASC
OFFSET [page*100]
LIMIT 1;

(Этот запрос должен будет пройти через эти строки, но если столбец проиндексирован, по крайней мере, он не должен читать никакие данные таблицы.)

...