首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在与多个条件匹配的一对多关系中进行查询时遇到困难的MySQL

在与多个条件匹配的一对多关系中进行查询时遇到困难的MySQL
EN

Stack Overflow用户
提问于 2010-12-02 00:30:58
回答 2查看 2.4K关注 0票数 3

我有两个表,大致列出如下:

代码语言:javascript
复制
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匹配)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-02 00:38:22

这是一个relational division问题。

在MySQL中,您建议使用COUNT的方法可能是最简单的

代码语言:javascript
复制
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,这将非常麻烦。

票数 7
EN

Stack Overflow用户

发布于 2010-12-02 00:42:01

我认为这应该能起到作用:

代码语言:javascript
复制
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_id
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4326561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档