【发布时间】:2014-12-18 16:06:18
【问题描述】:
假设我有一个页面,显示网上商店中所有可用的笔记本电脑。这些结果可以通过激活某些过滤器来优化,例如品牌、价格、重量、内存量、磁盘空间,如下所示:
Brand
[ ] Dell (16)
[ ] HP (12)
[ ] Lenovo (9)
Memory
( ) ≥ 2 GB (37)
( ) ≥ 4 GB (24)
( ) ≥ 8 GB (8)
Price
( ) ≤ 200 $ (3)
( ) ≤ 300 $ (12)
( ) ≤ 500 $ (22)
目前,我正在使用单个查询计算这些产品计数,我在 PHP 中循环遍历其结果以将它们划分为这些类别(即“内存,≥ 4 GB”)。这种方法的问题是选择例如“≥4GB”并且显示结果时,产品数量变得不合逻辑。
MySQL(简体):
SELECT brand, memory, price FROM Laptops WHERE memory >= 4000
PHP(简体):
while($row = msqli_fetch_assoc($results)) {
if($row['memory'] >= 2000) {
$product_count['memory']['2gb']++;
}
}
结果:
Memory
( ) ≥ 2 GB (24) <-- should be 37
(o) ≥ 4 GB (24)
( ) ≥ 8 GB (8)
因为现在我正在使用带有WHERE memory >= 4000 之类条件的查询,所以产品计数仅限于当前的 24 个结果(与激活的过滤器匹配),因此“≥ 2 GB”现在的计数为 24也是。确实,在 24 个结果中,24 个将具有 2 GB 或更多内存,但这与用户无关,用户需要知道如果选择 2 GB 将显示多少个结果。
我可以分别查询每个过滤器的数据库,忽略该过滤器的WHERE 条件,以便其产品计数不受其自身设置的影响,但仍受任何其他过滤器(如品牌)的影响。但是,我计划至少有十几个过滤器,这样会导致十几个查询,给原本相当简单的应用程序带来相对较大的额外压力。
是否有更有效的方法来计算产品数量,所需的查询更少?
【问题讨论】:
-
也许在 php 上 -> if($row['memory'] >= 2000 && $row['memory']
-
当您已经使用 php 过滤结果时,为什么还要在 sql 查询中使用 where ?使用您当前的 sql 查询,不会有任何 2gb 内存,因此 2gb 内存笔记本电脑的计数为 0。
-
@MarcoMura 问题是我正在使用有限的 MySQL 结果集。
-
@redburn 受什么限制?
-
听起来你需要一个单独的查询
标签: php mysql faceted-search