Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在分页中提取和显示每页的范围(最小-最大)数据?_Php_Sql_Mysql_Pagination - Fatal编程技术网

Php 如何在分页中提取和显示每页的范围(最小-最大)数据?

Php 如何在分页中提取和显示每页的范围(最小-最大)数据?,php,sql,mysql,pagination,Php,Sql,Mysql,Pagination,我有一个数据表,可以搜索和排序,但可能会产生数百或数千个广泛搜索的结果。假设用户搜索“foo”并按降价顺序对foo进行排序,我想显示一个快速跳转选择菜单,如下所示: <option value="1">Page 1 ($25,000,000 - $1,625,000)</option> <option value="2">Page 2 ($1,600,000 - $1,095,000)</option> <option value="3"&g

我有一个数据表,可以搜索和排序,但可能会产生数百或数千个广泛搜索的结果。假设用户搜索“foo”并按降价顺序对foo进行排序,我想显示一个快速跳转选择菜单,如下所示:

<option value="1">Page 1 ($25,000,000 - $1,625,000)</option>
<option value="2">Page 2 ($1,600,000 - $1,095,000)</option>
<option value="3">Page 3 ($1,095,000 - $815,000)</option>
<option value="4">Page 4 ($799,900 - $699,000)</option>
...
第1页($25000000-1625000)
第2页($1600000-1095000)
第3页($1095000-$815000)
第4页($799900-699000)
...
是否有一种直接从数据库查询此信息的有效方法?我一直在抓取所有匹配的记录,并使用PHP计算每个页面的最小值和最大值,这似乎效率低下,可能会导致缩放问题

我能想到的唯一可能的技术是,用某种方法计算出一个变量,该变量每X条记录递增一次(每一页X条记录递增一次),按此进行分组,然后为每个页面分组选择最小/最大值。。。不幸的是,我还没有想出一种生成该变量的方法。

虽然技术上可行,但我建议您不要浪费时间使用此功能,而要寻找另一种方法

首先,介绍分页的一些背景信息。分页通常使用
orderby。。。限制[偏移量],[行]
。为了让MySQL以给定的偏移量为您提供行,它必须读取前面的所有行,然后将它们扔掉。这是昂贵的,而且成本随着补偿的增加而增加。(例如,限制1000,20必须读取1020行,然后丢弃1000行)。如果无法使用索引完成ORDERBY,则情况更糟。这可能导致读取整个无限结果集,然后对其进行文件排序,然后丢弃前1000行以满足
限制1000,20

现在,让我们来解决您的具体问题。如图所示,分页并不是什么“神奇的”;这是一种相当野蛮的分页结果集的方式。具体地说,如果不对整个结果集进行排序,您就不知道什么页面会提前出现。要计算每页的最小值和最大值,您需要使用临时表,然后从该临时表计算整个结果集的每页最小值/最大值。如果您的数据是易变的,那么您需要在基础数据更改时经常重新计算

如果存储引擎以某种方式存储了给定顺序的每一行的“页面”,那么您可以相对轻松地完成这一任务。不幸的是,情况并非如此

此外,我怀疑你的方法对你的用户是否有用。您的示例显示了良好的价格分布。你能确定你不会得到像下面这样的范围吗

<option value="1">Page 1 ($1,005,000 - $1,004,000)</option>
<option value="2">Page 2 ($1,004,000 - $1,003,450)</option>
<option value="3">Page 3 ($1,003,450 - $1,003,387)</option>
<option value="4">Page 4 ($1,003,387 - $1,003,342)</option>
第1页($1005000-1004000)
第2页($1004000-$1003450)
第3页($1003450-$1003387)
第4页($1003387-$1003342)
我怀疑这对用户是否有好处

建议

  • 保持分页简单
  • 如果你想让用户能够选择一系列的价格,那么就把它作为一个过滤器——不要把它和分页结合起来
示例


在亚马逊上搜索一些东西,注意他们的结果页面。您只需将搜索结果分页即可。在左边,您将有各种各样的过滤器应用于您的搜索,以进一步完善它。

是的,这也是我得出的基本结论。。。只是不知道我是否错过了一些聪明的东西,可以让它很好地工作。FWIW我熟悉查询中的LIMIT/OFFSET,目前没有使用它的唯一原因是,我们必须在php中查看结果中的每一行,以构建每页的最小/最大值。提出了另一个问题。。。如果MySQL必须查看前X个匹配项来抵消它们,那么每次返回所有内容并在PHP中逐步完成集合是否会更糟糕?@Ty:是的。PHP做的任何事情,MySQL(C)都比PHP快10-100倍。@Ty:Pagination优化资源: