如何查询某些行的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页面上并分成两行