2016-08-28 4 views
2

製品フィルタ機能を追加しようとしています。各製品は、任意の数のフィルタを有することができる。フィルタから選択するMYSQLクエリ

私はそうのように私のテーブルを設定している:

row_id products_id filters_id 
    1   1   1 
    2   2   2 
    3   3   3 
    4   4   3 
    5   1   3 

ので、表にはproduct_idsと対応filter_idsのリストを持っています。このような単純な表のように見えるので、私はスクリプトが簡単だと考えました。しかし、私は本当にそれの周りに私の頭を得るために苦労しています。ただ一つのフィルタを選択した場合、一例として

SELECT p.products_id 
    , p.products_name 
    , p.products_short_desc 
    , p.products_price 
    , p.products_url 
    , p.products_image 
    , p.products_short_desc 
    , p.contact_pricing 
    , GROUP_CONCAT(ptc.categories_id) category_id 
    FROM products p 
    LEFT 
    JOIN prod_to_cat ptc 
    ON ptc.products_id = p.products_id 
    AND ptc.categories_id IN (3) 
WHERE p.products_status = 1 
GROUP 
    BY p.products_id 
HAVING COUNT(DISTINCT ptc.categories_id) = 1 
ORDER 
    BY p.products_price 

、それはこれも非常に微調整して、正常に動作しなかったID 3.ました:私が得た

ありクエリがありました。それはまた、私が思っていたことがとてもシンプルだったと思うので、複雑に見えます。

本質的に、このテーブルでは、すべての一致するfilters_idを持つすべての商品を選択することができますか?

フィルタ1と3が選択された場合、一致するすべての商品、つまり商品IDと対応するfilter_idsの表にある商品の結果を得たいと考えています。この例では、products_id 1を返します。フィルタ3が選択された場合、製品3,4が返されます。これはどのように達成されますか?

+0

だから、フィルタ1と3は、出力が行ID 1,3,4,5を表示していまし選択した場合は? – Jeff

+0

いいえ、そのORではなく、ANDです。フィルタ1と3が選択された場合は、products_id1だけが表示されます。例えば。あなたは赤いドレス、サイズのミディアム、赤いドレスやミディアムドレスが欲しい。 – Source

+0

私は、フィルタがオブジェクトの複数の列(プロパティ)に適用されているかどうかわかりませんか? – Jeff

答えて

2

それは私にはかなり簡単なようだ:

DROP TABLE IF EXISTS product_filters; 

CREATE TABLE product_filters 
(product_id INT NOT NULL 
,filter_id INT NOT NULL 
,PRIMARY KEY(product_id,filter_id) 
); 

INSERT INTO product_filters VALUES 
(1,1), 
(2,2), 
(3,3), 
(4,3), 
(1,3); 

SELECT product_id 
    FROM product_filters 
WHERE filter_id IN(1,3) 
GROUP 
    BY product_id 
HAVING COUNT(*) = 2; 
+------------+ 
| product_id | 
+------------+ 
|   1 | 
+------------+ 

SELECT product_id 
    FROM product_filters 
WHERE filter_id IN(3) 
GROUP 
    BY product_id 
HAVING COUNT(*) = 1; 
+------------+ 
| product_id | 
+------------+ 
|   1 | 
|   3 | 
|   4 | 
+------------+ 
+0

ありがとう、私はそれをテストできるように完全なクエリは何でしょうか? – Source

+0

提供されたデータセットに基づいて、それが完全なクエリになります。完全な答えが必要な場合は、完全な質問をしてください!私の答えは例として役立ちます。 – Strawberry

+0

OH!したがって、フィルタの数と同じ数の行を表示することで機能しますか?それは本当に賢いです。 – Source

関連する問題