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

时间:2014-08-08 15:32:08

标签: php mysql sql

我有2个mysql表。

产品

id, name

product_styles

id, products_id, attributes_id, attribute_options_id

我正在尝试创建商店过滤器。每个产品都可以有多个product_styles。但每个product_styles行都是唯一的。产品不能有两个具有相同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的产品。

1 个答案:

答案 0 :(得分:1)

您可以使用group byhaving子句执行此操作。我喜欢这种类型的查询方法(" set-within-sets"查询)因为它非常通用。这是一般的想法:

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;