如何查询SQLite中的特定行,即将其分成多页(Perl DBI)

5
抱歉,我的问题可能有点初学者级别。我正在编写一个带有SQLite数据库的Perl Web应用程序。我想在我的应用程序中显示查询结果,这个结果可能会有数千行数据,因此需要分页显示,路由应该为 /webapp/N,其中N是页码。使用DBI正确地查询SQLite数据库以仅获取相关行的方法是什么?
例如,如果每页要显示25行,则我想在第一页查询数据库中的1-25行,在第二页查询26-50行等。请问应该怎样处理?
4个回答

8
使用LIMIT/OFFSET语句可以显示分页内容,但是OFFSET会使查询变得低效,并且在数据发生变化时会导致页面内容移动。
如果下一页从上一页结束的位置开始查询,就更高效和一致了。示例如下:
SELECT *
FROM mytable
ORDER BY mycolumn
WHERE mycolumn > :lastvalue
LIMIT 25

这意味着您的链接不是/webapp?Page=N,而是/webapp?StartAfter=LastKey。详细解释请参见滚动游标页面

3
您应该像这样做:
SELECT column FROM table ORDER BY somethingelse LIMIT 0, 25

当用户点击第二页时,您应该执行以下操作:

SELECT column FROM table ORDER BY somethingelse LIMIT 25, 50

and so on..


2

您很可能会使用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/其他功能传递给你的脚本的参数来控制的。

1

分页是许多CPAN模块已经解决的问题之一。如果您正在使用纯SQL,可以考虑使用DBIx::Pager等工具。您还可以查看Data::Pageset等工具,以帮助您管理创建各个页面的链接。如果您正在使用DBIx::Class(这是一个非常好的工具)进行SQL查询,则DBIx::Class::ResultSet::Data::Pageset将使此过程变得非常容易。

基本上处理SQL是其中一部分,但您还需要解决模板方面的各种问题。我鼓励您查看这些模块,甚至可以在CPAN上进一步浏览,看看其他人已经为您完成了分页方面的繁重工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接