5

sorry for my noob question, I'm currently writing a perl web application with sqlite database behind it. I would like to be able to show in my app query results which might get thousands of rows - these should be split in pages - routing should be like /webapp/N - where N is the page number. what is the correct way to query the sqlite db using DBI, in order to fetch only the relavent rows.

for instance, if I show 25 rows per page so I want to query the db for 1-25 rows in the first page, 26-50 in the second page etc....

4

4 回答 4

7

使用LIMIT/OFFSET构造会显示页面,但是OFFSET会使查询效率低下,并且在数据更改时使页面内容移动。

如果下一页在最后一个结束的位置开始查询,则效率更高,更一致,如下所示:

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

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

滚动光标页面对此进行了详细说明。

于 2012-10-22T19:03:40.973 回答
3

你应该这样做:

SELECT column FROM table ORDER BY somethingelse LIMIT 0, 25

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

SELECT column FROM table ORDER BY somethingelse LIMIT 25, 50

等等..

于 2012-10-22T16:58:53.307 回答
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

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

于 2012-10-22T17:10:49.890 回答
1

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

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

于 2012-10-23T13:19:10.887 回答