首页 > 解决方案 > 如何使用 PHP 动态创建价格范围

问题描述

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

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

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

对于低于 500 美元的配件和超过 1.000 美元的鞋子(如果用户在目录中输入)如果用户输入一个类别,则必须更改为类似这样

<label>Less than $1.500 (40) <input type="checkbox" name="price[]" value="1"/></label>
<label>$1500 - $2.000 (43) <input type="checkbox" name="price[]" value="2"/></label>
<label>More than $2.000 (50) <input type="checkbox" name="price[]" value="3"/></label>

我使用 PHP、Jquery 和 MySQL。

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

非常感谢你。这是我在这里的第一篇文章。我想我让这可以理解。希望你能帮我!

编辑:

这个想法是过滤器显示如下:

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

我会添加一些图片以供参考

亚马逊 PC 价格过滤器

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

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

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

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

回答:

感谢@markus-ao 的回答

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

首先,计算表的总行数。

即 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 解释得很好。

标签: javascriptphpjquerymysqle-commerce

解决方案


这不是即插即用的答案。以下将为您提供整理此问题的必要线索。我相信您可以自己编写必要的 PHP SQL 样板来填补空白,并将其转化为可运行的实现。(如果没有,请雇用我和我的笑笑猫。=^o^=)

首先,您需要了解您所在类别产品的大致情况。该示例假设有一个名为andproducts列的表。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)中。然后,既然我们知道了产品的总量,我们可以查找 cat 产品的前 33% 的 MAX 和后 33% 的 MIN 以获得我们平衡价格范围的断点。

// 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/LIMITCOUNT但反映了最终结果集。)

然后,我们拥有所有必要的数据。现在让我们把它们放在一起。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']
    ]
];

您的示例动态价格范围组已准备好采取行动。您会注意到我们从低值和高值派生了中间值,而不是为它运行另一个查询。我相信您知道如何将数组转换为 HTML 标签和复选框。

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

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

为确保您没有低于查询切线的产品,您将希望您的低端查询实际查找 0- 之间的价格low_max(而不是规定的范围),以防您添加的产品比最低价格便宜在缓存刷新之间记录。对于高端查询也是如此,而是寻找high_min-9999999 或任何超出顶部的东西。简单WHERE price > $high_minprice < $low_max AND category = 3会做这项工作。

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


推荐阅读