MySQL 在匹配多个条件的一对多关系中苦苦挣扎

标签 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  |
                    | .. | ...        | ...       | ...    |
                    ========================================

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

我希望能够提取出与多个(也是无限的)属性条件匹配的不同产品,但我想不出如何在不使用 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/

相关文章:

mysql - 从存储过程返回一个结果集

php - 查询需要很长时间来执行 laravel

hibernate - 删除的对象将通过级联重新保存(从关联中删除删除的对象)

grails - 在Grails中有两个具有一对多关系的实体

java - 在新实体中保存映射集合

mysql - SQL DB 设计 - 具有临时限制的一对多

mysql - 如何在SQL查询中添加固定位置列?

mysql - 如何在grails中获取多个选定的文件?

php - MySQL 的问题

php - 教义 : How to unset (SET NULL) OneToMany relationship