MySQL在一对多匹配多个条件的关系中苦苦寻求查询

atk*_*aye 3 mysql one-to-many

我有两张表大致如下:

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  |
                    | .. | ...        | ...       | ...    |
                    ========================================
Run Code Online (Sandbox Code Playgroud)

产品可能存在无限量的属性,这就是为什么它们保存在单独的表中的原因.

我希望能够提取出与MULTIPLE(也是无限)属性条件相匹配的不同产品,但是我不知道如何在不使用OR条件的情况下完成它,然后进行某种计数来检查所有属性是否匹配.我相当肯定这不是最好的方式,所以希望有人可以提供帮助?!

例如,找到size ='medium'和color ='blue'的产品(这将匹配上例中的产品2).

Mar*_*ith 7

这是一个关系划分问题.

您建议的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
Run Code Online (Sandbox Code Playgroud)

NOT EXISTS在链接文章中还有另一种双重方法,但由于MySQL不支持非常繁琐的CTE.