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个产品
第一件产品"黑色衬衫"与
第二产品"蓝色牛仔裤"与
我有过滤器显示
尺寸
如果我选择Color Blue它显示2个产品而我选择Size Small仍然显示0个产品,我只需显示1个产品
答案 0 :(得分: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'
)
我认为这个查询可以简化,但很难说,因为你没有提供有关表结构或查询意图的信息。 downvotes可能是因为你没有在你的问题中包含这些信息。
编辑:
正如我所料,问题是set-within-sets查询。首先,您的查询是:
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
子句找到它们。