0

productテーブルとテーブルがありproduct_attributesます。必要な属性を持つフィルター製品が必要です。ここに私のSQLがあります:

SELECT * FROM product p 
INNER JOIN product_attributes p2 ON p.id = p2.product_id
WHERE p2.attribute_id IN (637, 638, 629))

ただし、製品の属性が 1 つしかない場合でも (たとえば 637)、すべての製品が表示されます。しかし、指定されたすべての属性 (637、638、629) を持つ製品が必要です。

4

3 に答える 3

1

かなり標準的なアプローチがあります:

select * from product
where id in (
    SELECT id
    FROM product p 
    JOIN product_attributes p2 ON p.id = p2.product_id
      AND p2.attribute_id IN (637, 638, 629)
    GROUP BY id
    HAVING COUNT(distinct attribute_id) = 3) 

HAVING 句は、3 つの異なる属性 ID が存在することを保証します (つまり、それらはすべて見つかりました)。

これは (ID IN(...) ではなく) 直接結合として表現できますが、読みやすく、このように OK を実行する必要があります。

少し興味深いのは、属性 ID 条件を JOIN の ON 条件に移動することです。

于 2013-05-31T07:26:18.730 に答える
0

次のようなクエリを使用できます。

SELECT * FROM product p 
INNER JOIN product_attributes p21 
        ON p.id = p21.product_id and p21.attribute_id = 637
INNER JOIN product_attributes p22 
        ON p.id = p22.product_id and p22.attribute_id = 638
INNER JOIN product_attributes p23 
        ON p.id = p23.product_id and p23.attribute_id = 629
于 2013-05-31T07:29:26.490 に答える