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数据。)
我有一个带有 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数据。)