SQL查询以检索与一个或多个筛选器匹配的产品

时间:2011-11-10 20:49:10

标签: php mysql

我正在撰写此消息,因为我没有关于以下内容的实现的想法:给定一个包含产品的表和另一个带有产品过滤器的表,我想根据所选过滤器检索产品。 / p>

表格如下:

产品:
的p_id,
p_name,
p_image

product_filters:
PF_ID,
pf_product_id,
pf_filter_id,
pf_filter_value

第三个表中包含过滤器名称和ID,但它并不那么重要。

从HTML表单中我得到一个包含过滤器ID和过滤器值的数组。

我尝试检索与所选过滤器匹配的产品的ID,但它仅适用于一个选定过滤器的文件。如果有多个选定的过滤器,我将无法获得任何结果。

我正在使用PHP和MySQL。

感谢。

2 个答案:

答案 0 :(得分:1)

我正在考虑创建这样的查询:

SELECT * FROM products WHERE p_id
IN 
  (
-- this will be repeated in PHP for every filter id and filter value 
    SELECT pf_prod_id FROM product_filters 
    WHERE pf_filter_id = @filterid AND pf_filter_value = @filtervalue
    UNION ALL -- omit this line if it's the last filter id 
-- end repeat
  )
应该做的伎俩(虽然它可能不是解决它的最漂亮的方法)

答案 1 :(得分:1)

我通常这样做的方法是为每个过滤器的过滤表添加一个连接:

SELECT p_id, p_name, p_image FROM products p
INNER JOIN product_filters pf1 ON p.p_id = pf1.pf_product_id
INNER JOIN product_filters pf2 ON p.p_id = pf2.pf_product_id
// Add another join for each additional filter
WHERE pf1.pf_filter_id = @filterid1 AND pf1.pf_filter_value = @filtervalue1
AND pf2.pf_filter_id = @filterid2 AND pf2.pf_filter_value = @filtervalue2
// Add conditions for each additional filter

执行此操作时,您只需要注意性能问题。对一些测试查询做一些解释,以确保您的索引设置正确,并且可以限制一次可以使用的过滤器数量。