PHP的SQLite分页有效的方法转到上一页/下一页

时间:2018-09-01 08:40:41

标签: php sqlite php-5.5

我有一个带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 |接下来,这个接缝很难。因此可以接受上一页和下一页的处理。

对于下一页处理,我正在使用:date> [init返回的最后一条记录]。这可行。芽回去,我需要跟踪第一次约会。我多次回去后,会变得凌乱。

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

1 个答案:

答案 0 :(得分:1)

没有人希望翻阅数千页;更好的搜索和过滤功能可以改善您的Web应用。

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

SELECT count(*) FROM Logs;

如果您想知道自己在哪一页上,则必须计算当前一页之前有多少行:

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

“下一个”和“上一个”函数的工作方式完全相反:您必须跟踪当前页面的最后一行/第一行,并且必须获取较大的下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;

(此查询将需要遍历这些行,但是如果该列已建立索引,则至少不必读取任何表数据。)