如何最有效地确定“页数”?

时间:2009-03-17 20:13:17

标签: php database pagination

我希望我不会写副本,但我找不到任何能回答我问题的内容。 (虽然在我看来这是一个非常普遍的问题。)

几乎每个Web项目都会出现问题:您有一个包含许多条目的表,并希望它们显示在单个页面上。

现在我想知道计算某组表行所需页数的最佳方法是什么。

这里有一些我一直在考虑的方法。我想对它们的效果有所回应。我将给出特定于PHP的示例,但我敢打赌其他语言​​中也有类似的技术。

  1. 最好的方法是静态保存页数,并在每次添加新条目时修改值。 (尽管如此......我正在寻找一个动态的解决方案:-))

  2. 对感兴趣的行执行SELECT COUNT(*)并在每次显示页面时计算页码。

  3. 执行普通选择以获取所有行的结果集。现在不要通过调用mysql_fetch_row左右来加载行,而是使用mysql_num_rows获取行数。 (因为我不知道这是如何实现的,我不知道它是否有效。任何人都知道吗?)然后我可以舒服地移动结果集指针。 (对于mysqli,有mysql_data_seek,但本机MySQL扩展没有类似的功能。因此我认为这只是mysqli的一些缓冲行为

  4. 有人可以说如何最有效地计算行数(页数)?

8 个答案:

答案 0 :(得分:9)

2号是最常见的模式

select count(*) from [Table] where [Expressions]

然后

select [Columns] from [Table] where [Expressions] limit [Pagesize] offset [Pagenum*Pagesize-Pagesize]

这为您提供了整个结果集的总行数,但只提供了当前页面的行数据。

许多框架或CMS都有会议用于在会话中缓存此数据的某些部分,您可能会或可能不想这样做,具体取决于您预期的表格大小,数据的波动性等。

答案 1 :(得分:3)

如果你真的想要一些真正的WTF比例,你总是可以通过在插入/删除时使用触发器递增一些寄存器来跟踪有多少行。

但我认为这是一个要求更多问题的答案;)。

如果必须,请使用SELECT COUNT。如果它很慢,那意味着你的数据库通常是错误的。

另外,我觉得这里有过早的优化爬行。不要过早优化。让它变得有意义,然后让它更有意义。合理?

答案 2 :(得分:0)

如果我理解正确,在我工作的大多数系统中,我需要同时获取页数,因为我正在为页面抓取一组新行。这允许显示“M页面N”或类似标题的内容,以及一个充满条目的屏幕。

它依赖于数据库,但通常传入current_page编号(或行号),然后执行“有限查询”(fetchsize,top等)以获取下一组行和总页码。如果下面的行数发生变化,它会变得很难看,但我通常不担心。

保罗。

答案 3 :(得分:0)

我认为您希望围绕单个SQL查询构建导航,该查询仅修改LIMIT关键字。例如SELECT * FROM myTable LIMIT 0,20将返回前20行。在第2页的PHP脚本中,您将SQL查询设置为SELECT * FROM myTable LIMIT 20,40,从而将行返回20到40.这是您要查找的内容吗?

可以使用PHP脚本构建导航,只需执行选择COUNT(*)/ rowsPerPage,然后循环代码结构,直到满足总行数。然后,结束查询将LIMIT到lastLimit,TotalRowCount。

编辑:计算计算所有行所需的页数,以便定义1页可以拥有的行数。然后,您将执行TotalRows / MaxPerPage = howManyPagesNeeded

答案 4 :(得分:0)

在此背景下需要考虑的两个问题:

  • 如何处理在查看时更新/插入的数据?
  • 将有多少并发用户浏览数据,并且应用程序能够在动态获取数据页时跟上流量吗?

根据答案的不同,此处的其他一些答案可能适用也可能不适用。

答案 5 :(得分:0)

您可能想查看this问题,这与您提出的问题非常相似。

答案 6 :(得分:0)

执行此操作的一种好方法是使用SQL_CALC_FOUND_ROWS

示例:

SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();

即使您将查询限制为10个结果,第二个查询也会返回未使用限制时返回的实际总行数。

重要的是要注意FOUND_ROWS()在使用MySQL的数据库复制时不可靠

答案 7 :(得分:-2)

实际上,如果您使用PHP填充网页,则更容易获取MySQL表,将数据放入数组并使用for循环来完成这样的数据

for($i=0;$i<count($arrayvar);$i++){}

使用简单的模板引擎,您可以在另一个块中声明一个块,并在一个连续的行中解析所有数据。

希望这是您正在寻找的答案类型。我不清楚你的问题是什么意思,但我认为就是这样。