如何使用 PHP 动态创建价格范围

How to create a Price Range dynamically with PHP

我已经看到另一个相关的问题,但这不是我想要的。参考 -> this

我想为电子商务网站创建价格范围过滤器。很多网站都有动态价格范围过滤器。

<label>Less than 0 (800) <input type="checkbox" name="price[]" value="1"/></label>
<label>0 - .000 (921) <input type="checkbox" name="price[]" value="2"/></label>
<label>More than .000 (1021) <input type="checkbox" name="price[]" value="3"/></label>

例如低于 500 美元的配饰和超过 1.000 美元的鞋子(如果用户输入目录)如果用户输入类别,则必须更改为这样的内容

<label>Less than .500 (40) <input type="checkbox" name="price[]" value="1"/></label>
<label>00 - .000 (43) <input type="checkbox" name="price[]" value="2"/></label>
<label>More than .000 (50) <input type="checkbox" name="price[]" value="3"/></label>

我用 PHP, Jquery & MySQL.

不要担心之后的查询,因为我将使用适用于范围的现有方法。这里的问题是如何动态生成组。

在此先感谢您。这是我第一次 post 来这里。我想我让这变得可以理解了。希望你能帮助我!

编辑:

想法是过滤器显示如下内容:

百分比不重要,但必须保持平衡。

我会添加一些图片作为参考

用于 PC 的亚马逊价格过滤器

Picture of Amazon Price Filter for PCs

适用于 Macbook 的亚马逊价格过滤器

Amazon Price Filter for Macbooks

我需要知道如何生成范围。根据数量的比例,范围必须是动态的。

答案:

感谢@markus-ao 的回答

这是我对这个问题的解决方案:

首先,计算 table 的总行数。

即1000 行,除以 3 --> 333

使用 LIMIT 得到中间的范围在总数的 33% 到 66% 之间。

SELECT min(price) mini, max(price) maxi
from (SELECT price FROM products order by price ASC limit 333, 333) x

你可以像这样使用它

$lessthan = $results['mini'];
$morethan = $results['maxi'];

echo '<button>Less than $lessthan</button>
<button>$lessthan - $morethan</button>
<button>More than $morethan</button>';

我虽然会更复杂,但@markus-ao 解释得很好。

这不是 plug-and-play 答案。以下内容将为您提供解决此问题的必要线索。我相信您可以自己编写必要的 PHP SQL 样板文件来填补空白,并将其转化为功能实现。 (如果没有,请雇用我和我的 lolcats。=^o^=)

首先,您需要了解您所在类别产品的大致情况。该示例假设 products table 的列名为 pricecategory.

SELECT
    MIN(price) AS min_price, 
    MAX(price) AS max_price, 
    AVG(price) AS avg_price,
    COUNT(*) AS total_items 
FROM products
WHERE category = 3

此查询将为您提供给定类别的最低、平均和最高价格,以及商品总数。 (我们只需要这里的总计数,如果没有用,请随意删除 min/max/avg。)让我们用 PHP 将其提取到变量 $cat(或 $meow)中.然后,既然我们知道了产品的总量,我们可以查找前 33% 的 MAX 和后 33% 的猫产品的 MIN 以获得我们的平衡价格范围' break-points.

// Assuming 1000 items, one third floored is 333.

$rangesize = floor($cat['total_items'] / 3);

// Get the min/max/total of the bottom 1/3, let's imagine we fetch it into $low:

SELECT 
    MIN(price) as low_min,
    MAX(price) as low_max,
    COUNT(*) AS low_total 
FROM (SELECT price FROM products 
WHERE category = 3
ORDER BY price ASC
LIMIT 0, $rangesize) low_prices // lowest price first, first 1/3 of records

这里的 ORDER 和 LIMIT 子句将我们缩小到 0-333 最便宜的商品。 COUNT(*) 在这里确实有点多余,因为我们已经知道我们将查询限制为的项目数。不管怎样,它就在那里。随意删除它,稍后只需使用 $rangesize 来计算总计。

// Get the min/max/total of the top 1/3, let's imagine we fetch it into $high:

SELECT 
    MIN(price) as high_min,
    MAX(price) as high_max,
    COUNT(*) AS high_total
FROM (SELECT price FROM products 
WHERE category = 3
ORDER BY price DESC
LIMIT 0, $rangesize) high_prices // highest price first, first 1/3 of records

这里的 ORDER 和 LIMIT 子句将我们缩小到 0-333 最贵的商品。 编辑: 我们正在使用子查询来获取具有 X 个最低价格的结果集。这是因为 MIN/MAX/AVG 聚合在 ORDER/LIMIT 子句之前被处理 。 (COUNT 然而反映了最终结果集。)

那么,我们就有了所有必要的数据。现在让我们把它们放在一起。 DynGroup::CompilesThou(!)

$group = [
    'low' => [ 
        'start' => $low['low_min'],
        'end' => $low['low_max'],
        'total' => $low['low_total']
    ],
    'mid' => [
        'start' => $low['low_max'],
        'end' => $high['high_min'],
        'total' => ($cat['total_items'] - $low['low_total'] - $high['high_total']) 
    ],
    'high' => [ 
        'start' => $high['high_min'],
        'end' => $high['high_max'],
        'total' => $high['high_total']
    ]
];

至此,您的示例动态价格范围组已准备就绪,可以采取行动了。您会注意到我们从低值和高值中导出 mid-range 值,而不是 运行 另一个查询。我相信您知道如何将数组变成 HTML 标签和复选框。

如果您想生成更多选项,只需修改总产品的除数(在我们前面的 $rangesize = 行中),并添加必要的查询以获得您想要的数据。对于五个选项,除以 5 并添加对 lowMid 和 midHigh 范围的查询,各占总数的 20%。如果你想要 30/40/30 或任何价差,只需做必要的数学运算等。

您可能希望缓存您的计算,并定期刷新它们。 (我只需要一个维护脚本来迭代所有类别并保存它们以供 front-end 使用。)

为确保查询 cut-line 下没有产品,您需要 low-end 查询实际上 寻找 0-low_max 之间的价格(而不是规定的范围),以防您添加的产品比缓存刷新之间记录的最低价格便宜。对于 high-end 查询也是如此,而是寻找 high_min-9999999 或任何超出顶部的内容。只需 WHERE price > $high_minprice < $low_max AND category = 3 即可。

如果有足够的时间、热情和技巧,一个聪明的 SQL 工匠可能会将上述所有内容放入一个包含子查询和其他内容的密集查询中。我觉得这是一个更具教育意义的答案途径。希望能帮助到你。快乐的制作;如果有任何不清楚的地方,请告诉我。