【问题标题】:How to determine the "number of pages" most effectively?如何最有效地确定“页数”?
【发布时间】:2009-09-23 05:29:55
【问题描述】:

我希望我没有写重复,但我还没有找到任何可以回答我的问题的东西。 (虽然在我看来这是一个很常见的问题。)

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

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

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

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

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

  3. 执行普通选择以获取所有行的结果集。现在不要调用mysql_fetch_row左右来加载行,而是用mysql_num_rows获取行数。 (由于我不知道这是如何实现的,所以我不能说它是否有效。有人知道吗?)然后我可以轻松地移动结果集指针。 (mysqlimysql_data_seek,但是MySQL原生扩展没有类似的功能,所以我假设这只是mysqli的一些缓冲行为)

谁能说如何最有效地计算行数(页数)?

【问题讨论】:

  • 用 PHP 完成这么简单的任务真的需要这么多工作吗?如果是这样,我非常非常非常高兴能够在 .NET 平台上进行编码!
  • 这些都不是很多工作 - 不知道你的意思是什么 pearcewg

标签: php database pagination


【解决方案1】:

数字 2 是最常见的模式

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

然后

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

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

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

【讨论】:

  • +1 这也是唯一允许每页可变数量项目的方法。另外,这很简单,至少我是这么认为的。
【解决方案2】:

如果您真的想要真正 WTF 比例的东西,您可以通过使用插入/删除触发器增加一些寄存器来始终跟踪有多少行。

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

如果需要,只需使用 SELECT COUNT。如果它很慢,这意味着您的数据库通常构建错误。

另外,我感觉这里有过早的优化。不要过早优化。让它有意义,然后让它更有意义。说得通?

【讨论】:

    【解决方案3】:

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

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

    保罗。

    【讨论】:

      【解决方案4】:

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

      导航可以使用您的 PHP 脚本构建,只需执行 select COUNT(*) / rowsPerPage 并因此循环代码结构直到满足总行数。然后,结束查询将 LIMIT 限制为 lastLimit,TotalRowCount。

      编辑:要计算需要多少页来计算所有行,您需要定义 1 页可以有多少行。然后你会做 TotalRows/MaxPerPage = howManyPagesNeeded

      【讨论】:

        【解决方案5】:

        在这种情况下要考虑的 2 个问题:

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

        根据答案,这里的其他一些答案可能适用也可能不适用。

        【讨论】:

          【解决方案6】:

          您可能想查看this 问题,它与您所问的非常相似。

          【讨论】:

            【解决方案7】:

            一个很好的方法是使用SQL_CALC_FOUND_ROWS

            例子:

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

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

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

            【讨论】:

              【解决方案8】:

              实际上,如果你用 PHP 填充网页,更容易获取 MySQL 表,将数据放入数组中,然后使用 for 循环来遍历数据,像这样

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

              即使是一个简单的模板引擎,您也可以在另一个块中声明一个块,然后在一行中解析所有数据。

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

              【讨论】:

                猜你喜欢
                • 2022-01-25
                • 1970-01-01
                • 1970-01-01
                • 2015-08-24
                • 2010-09-19
                • 1970-01-01
                • 2011-12-29
                • 1970-01-01
                • 2018-02-28
                相关资源
                最近更新 更多