php sqlite 分页高效的方式转到上一页/下一页

php sqlite pagination efficient way goto previous / next page

我有一个带有 sqlite 3 的 PHP (5.5) webapp。它有一个日志页面(将来可能有 10k 到 100k 日志)。我正在为这些日志使用 this way of paging。 我正在使用的 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 |接下来,这个接缝很难。因此,上一页和下一页处理是可以接受的。

对于下一页处理,我使用的是:日期 > [它在初始时返回的最后一条记录]。这行得通。巴德要回去了,我需要跟踪第一次约会。回去好几次之后就乱了。

解决这个问题的最佳方法是什么?

没有人愿意翻阅数千页;您的 webapp 可以通过更好的搜索和过滤得到改进。

无论如何,如果你想知道有多少页,你必须计算所有行:

SELECT count(*) FROM Logs;

如果你想知道你在第几页,你必须计算当前页之前有多少行:

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

"next" 和 "previous" 函数的工作方式完全相反:您必须跟踪当前页面的 last/first 行,并且您必须使用 larger/smaller 值获取接下来的 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;

(这个查询需要遍历这些行,但是如果列被索引,至少它不需要读取任何table数据。)