多个左连接表上的多个where子句


Multiple where clause on multiple left join tables

我有2个mysql表

产品

id, name

product_styles

id, products_id, attributes_id, attribute_options_id

我正在尝试创建一个商店过滤器。每个产品可以有多个product_styles。但是每个product_styles行都是唯一的。Product不能有两个具有相同attributes_id的product_styles。

例如我有2个产品

id:1, name:test1
id:2, name:test2

例如,我有2 product_styles

id:1, products_id:1, attributes_id:1, attribute_options_id:1
id:2, products_id:1, attributes_id:2, attribute_options_id:2 
id:3, products_id:2, attributes_id:1, attribute_options_id:3
id:4, products_id:2, attributes_id:3, attribute_options_id:4

如何选择所有产品

where attribute_options_id = 1 and  attribute_options_id = 1 
and where attributes_id = 2 and attribute_options_id = 2

只有当所有where子句都匹配时才返回产品。

在本例中应该只返回id为1的产品。

您可以使用group byhaving子句来完成此操作。对于这种类型的查询("集中集"查询),我喜欢这种方法,因为它非常通用。大致思路如下:

select ps.products_id
from product_styles ps
group by ps.products_id
having sum(attribute_id = 1 and attribute_options_id = 1) > 0 and
       sum(attributes_id = 2 and attribute_options_id = 2) > 0;

having子句中的每个条件查找其中一个属性的匹配。它通过计算满足条件的行数来实现这一点。> 0要求行存在。

如果你想要第一个条件,但不想要第二个条件,你可以把子句改成:

select ps.products_id
from product_styles ps
group by ps.products_id
having sum(attribute_id = 1 and attribute_options_id = 1) > 0 and
       sum(attributes_id = 2 and attribute_options_id = 2) = 0;