我希望我不会写副本,但我找不到任何能回答我问题的内容。 (虽然在我看来这是一个非常普遍的问题。)
几乎每个Web项目都会出现问题:您有一个包含许多条目的表,并希望它们显示在单个页面上。
现在我想知道计算某组表行所需页数的最佳方法是什么。
这里有一些我一直在考虑的方法。我想对它们的效果有所回应。我将给出特定于PHP的示例,但我敢打赌其他语言中也有类似的技术。
最好的方法是静态保存页数,并在每次添加新条目时修改值。 (尽管如此......我正在寻找一个动态的解决方案:-))
对感兴趣的行执行SELECT COUNT(*)
并在每次显示页面时计算页码。
执行普通选择以获取所有行的结果集。现在不要通过调用mysql_fetch_row
左右来加载行,而是使用mysql_num_rows
获取行数。 (因为我不知道这是如何实现的,我不知道它是否有效。任何人都知道吗?)然后我可以舒服地移动结果集指针。 (对于mysqli
,有mysql_data_seek
,但本机MySQL扩展没有类似的功能。因此我认为这只是mysqli
的一些缓冲行为
有人可以说如何最有效地计算行数(页数)?
答案 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++){}
使用简单的模板引擎,您可以在另一个块中声明一个块,并在一个连续的行中解析所有数据。
希望这是您正在寻找的答案类型。我不清楚你的问题是什么意思,但我认为就是这样。