如何查询某些行的sqlite,即将它分成页面(perl DBI)

Posted

技术标签:

【中文标题】如何查询某些行的sqlite,即将它分成页面(perl DBI)【英文标题】:how to query sqlite for certain rows, i.e. dividing it into pages (perl DBI) 【发布时间】:2012-10-12 12:55:18 【问题描述】:

对不起,我的菜鸟问题, 我目前正在编写一个带有 sqlite 数据库的 perl Web 应用程序。 我希望能够在我的应用程序查询结果中显示可能包含数千行的行 - 这些应该分成页面 - 路由应该像 /webapp/N - 其中 N 是页码。 使用 DBI 查询 sqlite db 的正确方法是什么,以便仅获取相关行。

例如,如果我每页显示 25 行,那么我想在数据库中查询第一页中的 1-25 行、第二页中的 26-50 行等......

【问题讨论】:

【参考方案1】:

使用LIMIT/OFFSET构造会显示页面,但是OFFSET会使查询效率低下,并且当数据发生变化时会使页面内容移动。

如果下一页从上一页结束的位置开始查询会更高效和一致,如下所示:

SELECT *
FROM mytable
ORDER BY mycolumn
WHERE mycolumn > :lastvalue
LIMIT 25

这意味着您的链接不是/webapp?Page=N,而是/webapp?StartAfter=LastKey

这在Scrolling Cursor page上有详细说明。

【讨论】:

【参考方案2】:

你应该这样做:

SELECT column FROM table ORDER BY somethingelse LIMIT 0, 25

当用户点击第 2 页时,您应该这样做:

SELECT column FROM table ORDER BY somethingelse LIMIT 25, 50

等等..

【讨论】:

【参考方案3】:

您很可能会使用 LIMIT 和 OFFSET 关键字,如下所示:

$sth->prepare("SELECT foo FROM bar WHERE something LIMIT ? OFFSET ?");
$sth->execute($limit, $offset);
while ( my @row = $sth->fetchrow_array )  # loop contains 25 items

$limit$offset 变量将由 html/cgi/whatever 特性传递给脚本的参数控制。

【讨论】:

【参考方案4】:

分页是许多 CPAN 模块已经解决的问题之一。如果您使用的是直接 SQL,则可以查看 DBIx::Pager 之类的内容。您可能还想查看Data::Pageset 之类的内容,以帮助您管理创建到各个页面的链接。如果您使用 DBIx::Class(这是一个出色的工具)进行 SQL 查询,那么 DBIx::Class::ResultSet::Data::Pageset 将使您轻松完成此操作。

基本上处理 SQL 是它的一方面,但您还需要解决它的模板方面的各种问题。我鼓励你看看这些模块,甚至可能更多地浏览 CPAN,看看其他人已经在哪里为你完成了关于分页的繁重工作。

【讨论】:

以上是关于如何查询某些行的sqlite,即将它分成页面(perl DBI)的主要内容,如果未能解决你的问题,请参考以下文章

如何在jsp页面上把从数据库中读取的一个字段的内容分割后显示在JSP页面上并分成两行

SQLite 和范围查询

如何选择 21 天(或更早)前的记录? (sqlite)

按列值查询某些行的联合和分组

如何使用ROWID编辑Python SQLite3中特定行的内容

如何从 SQLite3 和 PostgreSQL 中的时间戳中选择日期