我有两张表,大致如下:
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 条件的情况下做到这一点,然后进行某种计数来检查所有属性是否匹配.我相当确定这不是最好的方法,所以希望有人能提供帮助?!
例如,查找尺寸 = 'medium' 和颜色 = 'blue' 的产品(这将匹配上例中的产品 2)。
最佳答案
这是一个 relational division问题。
您使用COUNT
建议的方式可能是 MySQL 中最简单的方式
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,这将非常麻烦。
关于MySQL 在匹配多个条件的一对多关系中苦苦挣扎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4326561/