Mysql“多对一”的产品选择关系?

时间:2012-01-16 12:20:37

标签: mysql one-to-many many-to-one

我很难掌握如何做到这一点。我正在制作一个“产品选项”表,其中包含基于所附属性的产品的所有可能变体。因此,如果产品上附有红色,小号,蓝色和大号,则选项有小红色,大红色,小蓝色和大蓝色。为此,我认为我必须扭转一对多,但我很难如何。

现在我正在尝试检索与指定值匹配的选项。因此,例如,如果我搜索红色和小号,它将给我“小红色”选项。这就是我根据previous question提出的问题:

SELECT o.name
FROM shop_products_options o
WHERE o.id IN (
    SELECT v.option_id
    FROM shop_products_options_values v
    WHERE v.product_id = 1 AND v.value_id IN(4,7)
    GROUP BY v.option_id
)

这将返回与4或7(小值和红色值的ID)匹配的所有选项。我怎样才能让它返回与 4和7完全匹配的option_id?

我可以使用逗号分隔的列表来完成它,但我宁愿看看是否有一种标准化的方法可以首先执行它。 感谢您的任何建议:)

1 个答案:

答案 0 :(得分:0)

除非我误解,否则尝试这样的事情。搜索4的所有option_id,然后搜索7并使用INTERSECT仅返回两者都存在的值。

SELECT o.name
FROM shop_products_options o
WHERE o.id IN (
SELECT v.option_id
FROM shop_products_options_values v
WHERE v.product_id = 1 AND v.value_id = 4
GROUP BY v.option_id

INTERSECT

SELECT v.option_id
FROM shop_products_options_values v
WHERE v.product_id = 1 AND v.value_id = 7
GROUP BY v.option_id
)

注意 - MySQL不支持INTERSECT,因此另一种方法是使用多个子查询

SELECT o.name
FROM shop_products_options o
WHERE o.id IN (
SELECT v.option_id
FROM shop_products_options_values v
WHERE v.product_id = 1 AND v.value_id = 4
GROUP BY v.option_id
)

AND o.id IN (
SELECT v.option_id
FROM shop_products_options_values v
WHERE v.product_id = 1 AND v.value_id = 7
GROUP BY v.option_id
)

GROUP BY部分可能没有必要