代码之家  ›  专栏  ›  技术社区  ›  okoman

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

  •  3
  • okoman  · 技术社区  · 17 年前

    我希望我没有写重复的东西,但我还没有找到任何能回答我问题的东西。(尽管在我看来这是一个相当普遍的问题。)

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

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

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

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

    2. 做一个 SELECT COUNT(*) 并在每次显示页面时计算页码。

    3. 执行普通选择以获取所有行的结果集。现在不要通过调用 mysql_fetch_row 大约是这样,但是用 mysql_num_rows . (因为我不知道这是如何实现的,所以我不能说它是否有效。谁知道呢?)。(用于 mysqli mysql_data_seek ,但本机MySQL扩展没有类似的功能。因此,我假设这只是 mysqli

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

    8 回复  |  直到 17 年前
        1
  •  9
  •   Peter Bailey    17 年前

    数字2是最常见的模式

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

    然后

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

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

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

        2
  •  3
  •   Kent Fredric    17 年前

    如果您真的想要得到真正的WTF比例,那么您可以通过在insert/delete上使用触发器增加一些寄存器来跟踪有多少行。

    如果有必要,只需使用SELECT COUNT。如果它运行缓慢,则意味着您的数据库通常构建错误。

    而且,我感觉这里有一种过早的优化。不要过早地优化。让它有意义,然后让它更有意义。有道理?

        3
  •  0
  •   Paul W Homer    17 年前

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

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

    保罗。

        4
  •  0
  •   Chris Dale    17 年前

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

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

    编辑:要计算需要多少页来计算所有行,您需要定义一页可以有多少行。然后执行TotalRows/MaxPerPage=需要多少页

        5
  •  0
  •   cdonner    17 年前

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

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

        6
  •  0
  •   Community Mohan Dere    9 年前

    你可能想退房 this 问题,它和你所问的非常相似。

        7
  •  0
  •   Jacob    16 年前

    SQL_CALC_FOUND_ROWS

    例子:

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

    值得注意的是 FOUND_ROWS()

        8
  •  -2
  •   Vordreller    17 年前

    实际上,如果用PHP填充网页,只需获取MySQL表,将数据放入数组中,然后使用for循环遍历数据就更容易了

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

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