2016-08-29 10 views
4

フィルタIDを持つ製品IDを格納するテーブルがあります。マッピングは1対多です。 (1つの製品は多くのフィルタと関連付けることができます)。今私はすべて基準に一致するレコードを取得する必要があります。例えば、私はFILTERS 1,5および7を持っている製品Iは、1〜5以下Mysqlのクエリで結合とフィルタを使用する

7にマッピングされている製品のような完全一致がテーブル構造

CREATE TABLE IF NOT EXISTS `product_to_filter` (
    `product_id` int(11) NOT NULL, 
    `filter_id` int(11) NOT NULL, 
    PRIMARY KEY (`product_id`,`filter_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
ありたいを取得する必要があると言います

私は以下のクエリを試しましたが、それは私に希望の結果を取得していません。

select distinct p1.product_id, p1.filter_id from product_to_filter p1 
join product_to_filter p2 on 1=1 
join product_to_filter p3 on 1=1 
where 
p1.filter_id=1 AND p2.filter_id=5 AND p3.filter_id=7 

親切に登録しようではこの問題に

答えて

1

これを行うには良い方法可能があるかもしれない、あなたにも、スクリプトの下

を使用することができます
SELECT distinct p1.product_id 
FROM product_to_filter p1 
WHERE EXISTS(SELECT 1 from product_to_filter p2 WHERE p1.product_id=p2.product_id AND p2.filter_id=2) 
AND EXISTS(SELECT 1 from product_to_filter p3 WHERE p1.product_id=p3.product_id AND p3.filter_id=5) 
AND EXISTS(SELECT 1 from product_to_filter p4 WHERE p1.product_id=p4.product_id AND p4.filter_id=7) 
+0

こんにちはJaydip、クエリが動作しています、私は別個の行が必要ですが、すべてをフェッチしています。 – VIGNESH

+0

@pepAg product_idはPRIMARY KEYですか? –

+0

@PepAg 'select'文から 'p1.filter_id'を削除するだけです –

1

変更の解除方法で私を助け:

SELECT p1.product_id 
FROM product_to_filter p1 
JOIN product_to_filter p2 ON p2.product_id = p1.product_id 
JOIN product_to_filter p3 ON p3.product_id = p1.product_id 
WHERE p1.filter_id = 1 
AND p2.filter_id = 5 
AND p3.filter_id = 7 
1

EXISTSと組み合わせて、のすべてのフィルタを数えます句を使用すると、セット2, 5, 7に3つの異なるフィルタが適用されている必要があります。

SELECT DISTINCT p1.product_id, p1.filter_id 
FROM product_to_filter p1 
WHERE EXISTS (
    SELECT 1 
    FROM product_to_filter p2 
    WHERE p1.product_id = p2.product_id 
    AND p2.filter_id IN (2, 5, 7) 
    GROUP BY p2.product_id 
    HAVING COUNT(DISTINCT p2.filter_id) = 3 
) 
関連する問題