0

私は2つの列を持つテーブルを持っています:

product_id と attr_value_id

このクエリでは、39 行を取得します。

SELECT * FROM ka_product_attributes WHERE attr_value_id IN ( 655, 656, 658 )

このクエリでは、58 行を取得します。

SELECT * FROM ka_product_attributes WHERE attr_value_id IN ( 655, 656, 658, 589 )

attr_value_id 589 と次の attr_value_id 655、656、658 のいずれかを持つすべての product_id を選択する方法は?

このようなもの:

SELECT * FROM ka_product_attributes WHERE ( attr_value_id IN ( 655, 656, 658 ) AND attr_value_id IN ( 589 ) ) GROUP BY product_id HAVING COUNT( product_id ) >1

しかし、これはうまくいきません。

4

1 に答える 1

0

EAV モデルは (従来のリレーショナル モデルでは) 単一のレコードの属性を複数のテーブル行に「分散」させるため、複数の属性に基づいてアイテムを検索するには、次のような自己結合を使用する必要があります。

SELECT DISTINCT A1.product_id    -- see note about DISTINCT, below
FROM ka_product_attribute A1
JOIN Ka_product_attribute A2 ON A1.product_id == A2.product_id
WHERE A1.attr_value_id = 589
  AND A2.attr_value_id in (655, 656, 658)

-- The 'DISTINCT' is only necessary if duplicates are allowed for values of the
-- attribute 589. (in other words if ka_product_attributes can have several
-- records with for a product_id + attr_value_id combination).
于 2012-11-12T18:27:08.127 に答える