我觉得这个问题可能已经被问了一千次了,所以如果它被回答了,我很抱歉。如果是这样,有人可以指出我正确的帖子/链接吗?
我想做的是为我的网站构建一个多面导航。它使用 MySQL,这是我正在使用的表的粗略草图:
产品: - ID - 标题 - 描述
属性: - product_id - 姓名 - 价值
类别: - ID - 姓名
products_to_categories: - product_id - category_id
我想要做的是在您处于某个类别时显示可用属性列表,允许您为每个属性选择一个或多个值。举个例子,看看 Office Depot 的这个页面:http ://www.officedepot.com/a/browse/binders/N=5+2177/
到目前为止,我已经使用了很多连接来过滤多个属性:
选择产品。*,a_options。* FROM products_to_categories AS pc, products, attributes AS a_options, /* 我可以继续完善的属性/值对列表 */ attributes AS a_select1 /* 第一个选择的属性 */ attributes AS a_select2 /* 第二个选择的属性 */ ... 哪里 pc.category_id = 1 AND products.id = pc.product_id 和 a_options.product_id = products.id AND a_options.name != '颜色' AND a_options.name != '尺寸' 和 a_select1.product_id = products.id AND a_select1.name = '颜色' AND (a_select1.value = '蓝色' OR a_select1.value = '黑色') 和 a_select2.product_id = products.id AND a_select2.name = '大小' AND a_select2.value = '8.5 x 11'
基本上a_options
将返回那些产品的所有属性,这些产品是我使用a_select1
和应用的过滤器的子集a_select2
。因此,如果我使用 Office Depot 中的 Binders 示例,我想在为颜色选择蓝色或黑色并为尺寸选择“8.5 x 11”后显示所有可用属性。
然后我使用 PHP 代码删除重复项并将生成的属性排列到一个数组中,如下所示:
属性[name1] = (val1, val2, val3, ...) 属性[name2] = (val1, val2, val3, ...)
有没有办法可以加快查询速度或更有效地编写它?我在属性表(以及所有 ID 号)中设置了名称和值的索引。但是如果有人选择了几个属性,那么查询运行速度很慢。
提前感谢您的帮助,
Sridhar