我有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的产品。
答案 0 :(得分:1)
您可以使用group by
和having
子句执行此操作。我喜欢这种类型的查询方法(" 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;