我有两个表,大致列出如下:
products product_attributes
================== ========================================
| id | name | | id | product_id | attribute | value |
================== ========================================
| 1 | product 1 | | 1 | 1 | size | big |
| 2 | product 2 | | 2 | 1 | colour | red |
| 3 | product 3 | | 3 | 2 | size | medium |
| 3 | product 3 | | 4 | 2 | age_range | 3-5 |
| .. | ... | | 5 | 2 | colour | blue |
================== | 6 | 3 | size | small |
| .. | ... | ... | ... |
========================================一个产品可能有无限数量的属性,这就是为什么它们被保存在一个单独的表中。
我希望能够提取匹配多个(也是无限的)属性条件的不同产品,但我无法想象如果不使用OR条件,然后使用某种计数来检查所有属性是否匹配,该如何做到这一点。我很确定这不是最好的方法,所以希望有人能帮上忙?!
例如,查找size = 'medium‘和colour = 'blue’的产品(这将与上面示例中的产品2匹配)。
发布于 2010-12-02 00:38:22
这是一个relational division问题。
在MySQL中,您建议使用COUNT的方法可能是最简单的
SELECT product_id
FROM product_attributes pa
WHERE (attribute='size' and value='medium')
OR (attribute='colour' and value='blue')
GROUP BY product_id
HAVING COUNT(DISTINCT CONCAT(attribute,value) ) = 2在链接的文章中还有另一种使用双重NOT EXISTS的方法,但由于MySQL不支持CTE,这将非常麻烦。
发布于 2010-12-02 00:42:01
我认为这应该能起到作用:
SELECT a.product_id, p.name FROM product_attributes AS a LEFT JOIN products p ON (a.product_id=p.id) WHERE (a.attribute="size" AND a.value="medium") OR (a.attribute="colour" AND a.value="blue") GROUP BY a.product_idhttps://stackoverflow.com/questions/4326561
复制相似问题