这是我的第一个问题。我搜索了很多文档,但找不到答案 我有3张桌子。
product_main(with idx and name)<br />
proudct_attributes (with idx 'pid gid value)<br />
product_attributes_groups (with idx name) <br />
现在我尝试按属性过滤产品。我对单一属性没有任何问题,但我无法使用多种条件进行过滤,例如(红色或蓝色,但只是新的)
SELECT `pid` FROM `product_attributes`
LEFT JOIN `product_main` ON `product_attributes`.`pid` = `product_main`.`idx`
LEFT JOIN `product_attributes_groups` ON `product_attributes`.`gid` = `product_attributes_groups`.`idx`
WHERE
(
(`product_attributes_groups`.`name` = 'color' AND `product_attributes`.`value` ='red' )
OR
(`product_attributes_groups`.`name` = 'color' AND `product_attributes`.`value` ='blue' )
)
AND
(`product_attributes_groups`.`name` = 'condition' AND `product_attributes`.`value` ='new' )
编辑:
这有助于:
选择pm
。idx
从product_attributes
pa
加入
product_main
为pm
在pa
。pid
= pm
。idx
加入
product_attributes_groups
为pig
在pa
。gid
= pig
。idx
按pm
分组。idx
总和(pig
。name
='颜色'和pa
。value
in('red','blue'))&gt; 0和
sum(pig
。name
='condition'和pa
。value
='used')&gt; 0;
戈登回答,稍加编辑。
答案 0 :(得分:0)
像
这样的条件WHERE
`product_attributes_groups`.`name` = "something"
AND `product_attributes_groups`.`name` = "something else"
永远不会是真的。检查您的目标,并重写您的过滤器。
答案 1 :(得分:0)
试试这个。它应该与组合(名称AND(红色或蓝色))OR(条件和新)
一起使用SELECT `pid` FROM `product_attributes`
LEFT JOIN `product_main` ON `product_attributes`.`pid` = `product_main`.`idx`
LEFT JOIN `product_attributes_groups` ON `product_attributes`.`gid` = `product_attributes_groups`.`idx`
WHERE
(`product_attributes_groups`.`name` = 'color' AND (`product_attributes`.`value` ='red' OR `product_attributes`.`value` ='blue') )
OR
(`product_attributes_groups`.`name` = 'condition' AND `product_attributes`.`value` ='new' )
答案 2 :(得分:0)
您有一个“set-within-sets”查询,您在其中尝试查找组内的匹配项(产品属性)。我喜欢用聚合和having
子句解决这些问题:
select pm.pid
from product_attributes pa join
product_main pm
on pa.`pid` = pm.`idx` join
product_attributes_groups pig
on pm.`gid` = `pig`.`idx`
group by pm.pid
having sum(pig.`name` = 'color' AND `pa`.`value` in ('red' , 'blue')) > 0 and
sum(pig.`name` = 'condition' AND pa.`value` ='new') > 0;
having
子句中的每个条件都计算符合一个条件的每个pid
的行数。