-3
CREATE TABLE IF NOT EXISTS `owv_product_option` (
  `product_option_id` int(11) NOT NULL AUTO_INCREMENT,
  `product_id` int(11) NOT NULL,
  `option_id` int(11) NOT NULL,
  `option_value` text NOT NULL,
  `required` tinyint(1) NOT NULL,
  PRIMARY KEY (`product_option_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;


CREATE TABLE IF NOT EXISTS `owv_product_option_value` (
  `product_option_value_id` int(11) NOT NULL AUTO_INCREMENT,
  `product_option_id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  `option_id` int(11) NOT NULL,
  `option_value_id` int(11) NOT NULL,
  `quantity` int(3) NOT NULL,
  `subtract` tinyint(1) NOT NULL,
  `price` decimal(15,4) NOT NULL,
  `price_prefix` varchar(1) NOT NULL,
  `points` int(8) NOT NULL,
  `points_prefix` varchar(1) NOT NULL,
  `weight` decimal(15,8) NOT NULL,
  `weight_prefix` varchar(1) NOT NULL,
  PRIMARY KEY (`product_option_value_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;
SELECT distinct(pv.product_id)
FROM owv_product_option pv, owv_product_option_value pov
where pov.product_id = pv.product_id
and pov.option_id in (1,2)
and (pov.option_value_id in (2,6))
and (pov.option_value_id in (3)) 

我有 2 个产品

第一款产品“黑色衬衫”

  • 颜色:红色、蓝色
  • 尺寸:小号、中号

2nd 产品“蓝色牛仔裤”与

  • 颜色:蓝色
  • 尺寸:无

我有过滤器显示

  • 颜色:
  • 红色的
  • 蓝色的
  • 黑色的

尺寸

  • 小的
  • 中等的
  • 大的

如果我选择了蓝色,它显示 2 个产品,我选择了小尺寸,它仍然显示 0 个产品,我只需要显示 1 个产品

4

1 回答 1

0

您的查询的问题是第二条in语句。表别名pv2未在外部上下文中定义。这大概就是你的意思:

SELECT distinct(pv.product_id) 
  FROM owv_product_option pv, 
       owv_product_option_value pov 
 where pov.product_id = pv.product_id 
   and pov.option_value_id in (2,5) 
   and pv.option_id = '1' 
   and pv.products_id in ( SELECT distinct(pv2.product_id) 
                             FROM owv_product_option pv2, 
                                  owv_product_option_value pov2 
                            where pov2.product_id = pv2.product_id 
                              and pov2.option_value_id in (4,7) 
                              and pv2.option_id = '2'
                         ) 
   and pv.products_id in ( SELECT distinct(pv3.product_id)
                              FROM owv_product_option pv3,
                                   owv_product_option_value pov3
                             where pov3.product_id = pv3.product_id
                               and pov3.option_value_id in (8)
                               and pv3.option_id = '3'
                          ) 

我认为这个查询可以简化,但很难说,因为您没有提供有关表结构或查询意图的信息。否决票可能是因为您没有在问题中包含此信息。

编辑:

正如我所料,问题是集合内集合查询。首先,您的查询是:

SELECT distinct(pv.product_id)
FROM owv_product_option pv, owv_product_option_value pov
where pov.product_id = pv.product_id
and pov.option_id in (1,2)
and (pov.option_value_id in (2,6))
and (pov.option_value_id in (3)) 

对于任何给定的行,pov.option_value_id不能是“2 或 6”“3”。您想要这个版本,其中逻辑移至having子句:

SELECT pv.product_id
FROM owv_product_option pv join
     owv_product_option_value pov
     on pov.product_id = pv.product_id
group by pv.product_id
having sum(pov.option_id in (1,2) and pov.option_value_id in (2,6)) > 0 and
       sum(pov.option_id in (1,2) and pov.option_value_id in (3)) > 0;

也就是说,您需要条件为真的每个产品的行。有多行,因此您必须将它们组合在一起并在集合中查找模式。您无法where在单行上使用子句找到它们。

于 2013-08-11T13:50:26.243 回答