我有一个带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返回的最后一条记录]。这可行。芽回去,我需要跟踪第一次约会。我多次回去后,会变得凌乱。
解决此问题的最佳方法是什么?
答案 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;
(此查询将需要遍历这些行,但是如果该列已建立索引,则至少不必读取任何表数据。)