【问题标题】:php sqlite pagination efficient way goto previous / next pagephp sqlite 分页有效方式转到上一页/下一页
【发布时间】:2019-02-07 03:15:13
【问题描述】:

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

对于下一页处理,我使用:日期> [它在初始化时返回的最后一条记录]。这行得通。巴德要回去,我需要记录第一次约会。在我多次返回后,这变得很乱。

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

【问题讨论】:

  • 您将后退视为前进,除了当前显示的最后一个条目之后的前 100 行,您使用第一个条目之前的 100 个条目。 (如果您可以有多个具有相同时间戳的行,请使用该链接中也提到的两列比较)
  • 另一种选择是有一个表格来保存每个页面的起始行,但这最适用于静态或大部分静态数据 - 每次添加条目时都必须检查是否有新的页面启动并添加到索引(如果是)。不过,它确实可以让您有效地跳转到任意页面。

标签: php sqlite php-5.5


【解决方案1】:

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

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

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;

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

【讨论】:

  • 无法解决这个皱纹,这正是我要找的东西,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 2013-10-29
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 2013-06-17
相关资源
最近更新 更多