如何在分页中拉出并显示每页的范围(最小 - 最大)数据?

时间:2010-03-15 16:19:51

标签: php sql mysql pagination

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

<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>
...

是否有直接从数据库查询此信息的有效方法?我一直在抓取所有匹配的记录,并使用PHP来计算每个页面的最小值和最大值,这似乎效率低下并且可能导致缩放问题。

我能够想出的唯一可能的技术是使用计算变量来增加每个X记录(X记录到页面),按此分组,并为每个页面分组选择MIN / MAX ...遗憾的是,我无法想出一种方法来生成该变量。

1 个答案:

答案 0 :(得分:2)

虽然技术上可能,但我建议您不要浪费时间使用此功能,并寻找其他方法。

首先,有关分页的一些背景信息。分页通常使用ORDER BY ... LIMIT [offset], [rows]完成。为了让MySQL为您提供给定偏移量的行,它必须读取所有之前的行然后将它们丢弃。这是昂贵的并且随着偏移的增加成本增加。 (例如,LIMIT 1000,20必须读取1020行,然后扔掉1000)。当使用索引无法完成ORDER BY时,情况会更糟。这可能会导致整个无限制结果集被读取,然后进行文件排序,然后然后将丢弃前1000行以满足LIMIT 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>

我怀疑这对用户是否有任何好处。

<强>建议

  • 保持您的分页简单
  • 如果您希望用户能够选择一系列价格,请将其作为过滤器构建 - 不要将其与分页相结合。

示例

在亚马逊上搜索某些内容并注意其结果页面。您只需对搜索结果进行分页即可。在左侧,您将有各种过滤器应用于您的搜索,以进一步优化它。