3

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

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

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

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

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

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

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

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

4

8 回答 8

9

2号是最常见的模式

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

进而

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

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

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

于 2009-03-17T20:25:25.853 回答
3

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

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

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

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

于 2009-03-17T20:24:24.263 回答
0

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

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

保罗。

于 2009-03-17T20:25:24.683 回答
0

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

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

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

于 2009-03-17T20:29:28.107 回答
0

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

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

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

于 2009-03-17T20:32:25.710 回答
0

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

于 2009-03-24T16:10:08.833 回答
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 的数据库复制时不可靠

于 2009-09-22T21:29:55.527 回答
-2

实际上,如果您正在使用 PHP 填充网页,那么只需获取 MySQL 表,将数据放入数组并使用 for 循环来遍历数据就更容易了

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

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

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

于 2009-03-17T20:35:21.383 回答