在MySQL中使用多个OR / AND进行过滤

时间:2013-08-30 11:46:17

标签: php mysql

这是我的第一个问题。我搜索了很多文档,但找不到答案 我有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' )

编辑:

这有助于: 选择pmidxproduct_attributes pa加入      product_mainpm      在papid = pmidx加入      product_attributes_groupspig      在pagid = pigidxpm分组。idx 总和(pigname ='颜色'和pavalue in('red','blue'))&gt; 0和        sum(pigname ='condition'和pavalue ='used')&gt; 0;

戈登回答,稍加编辑。

3 个答案:

答案 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的行数。