1

这是我在这里的第一个问题。我搜索了很多文档,但找不到答案。
我有 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. idxproduct_attributesas pajoin product_mainas pm on papid= pmidx加入 。product_attributes_groups_ pig _ = 。 分组。 有 sum( . = 'color' AND . in ('red' , 'blue')) > 0 和 sum( . = 'condition' AND . ='used') > 0;pagidpigidxpmidxpignamepavaluepignamepavalue

戈登的回答,稍作编辑。

4

3 回答 3

0

像这样的条件

WHERE
    `product_attributes_groups`.`name` = "something"
    AND `product_attributes_groups`.`name` = "something else"

永远不可能是真的。检查您的目标并重写您的过滤器。

于 2013-08-30T11:50:00.910 回答
0

试试这个。它应该与组合(名称和(红色或蓝色))或(条件和新)一起使用

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' )
于 2013-08-30T11:50:30.360 回答
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

于 2013-08-30T11:54:01.117 回答