我有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 by
和having
子句来完成此操作。对于这种类型的查询("集中集"查询),我喜欢这种方法,因为它非常通用。大致思路如下:
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;