【发布时间】:2009-04-01 19:28:56
【问题描述】:
我需要过滤某些属性存储在与所有必需属性匹配的连接表中的产品,即用户需要能够通过添加要求逐渐缩小搜索范围。
考虑到以下(简化的)产品属性表,我认为问题实际上只涉及属性表,而不是连接:
id product_id 属性值 --------------------------------- 1 1 红色 2 1 小号 3 2色红色 4 2 大号如何获得 value 为“red”和“small”的所有 product_id?
之前有一个类似的问题was asked,但没有完全回答。一个解决方案涉及 COUNT 和 HAVING 来获取每组中的行数与所需值一样多的行,例如
SELECT product_id, count(*) AS group_count FROM properties where
value = 'red' OR value = 'small'
GROUP BY product_id
HAVING group_count = 2
这可行,但我担心性能,似乎会有更好的方法。
最终这将需要与 products 表连接,或至少用于过滤 products 表:
身份证名称 ------------- 1 产品 1 2 产品 2我忘了提到我有 2 个属性表连接到我需要过滤的产品,一个具有产品的常规属性,另一个具有可用的可配置选项(有点像变体)。 该方案是允许用户过滤产品,例如: “显示性别 = '男'、品牌 = '耐克' 和尺寸 == '小'的产品”,其中性别和品牌是“属性”,尺寸在选项中(添加到购物车时可配置)
使用带有计数的组的解决方案仍然适用于 2 个连接的表,但它会变得混乱,所需的组计数是第一个表上所需选项的数量乘以第二个表上的数字。
我可以从属性(和另一个表)中获取 id,然后只选择其中 id IN(ids),匹配两个属性表的一组 id,我不喜欢这样做的想法一个非常长的 ID 列表。
【问题讨论】:
-
在您的示例中,当 group_count 大于 2 时会发生什么?他们将被排除在外。我认为您应该将其设置为 HAVING group_count > 0