-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つの製品を持っています

第1弾商品「黒ブラウス」付

  • カラー:レッド、ブルー
  • サイズ:小、中

2作目「ブルージーンズ」

  • 青色
  • サイズ:なし

表示するフィルターがあります

  • 色:
  • 青い

サイズ

  • 小さな
  • 中くらい
  • 大きい

Color Blue を選択して 2 つの製品を表示し、Size Small を選択してもまだ 0 製品を表示している場合、1 つの製品のみを表示する必要があります

4

1 に答える 1

0

クエリの問題は、2 番目の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'
                          ) 

このクエリは単純化できると思いますが、テーブル構造やクエリの意図に関する情報が提供されていないため、言いにくいです。反対票はおそらく、この情報を質問に含めなかったことが原因です。

編集:

予想通り、問題は 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単一の行で句を使用してそれらを見つけることはできません。

于 2013-08-11T13:50:26.243 に答える