2017-05-02 10 views
-1

私は一連の製品を用意しています。それぞれの製品にはフィルタが関連付けられています。したがって、私は持っています:WHERE IN句の列を2回使用する

table: products {id, name} 
table: filters {id, name, type} 
table filters_to_products {id, filter_id, product_id} 

使用される外部キーはありません。すべてが論理的に実装されています。

私のフィルタは2つのタイプがあります。サイズ

問題:私は色のセットと、少なくとも一つの大きさからから少なくとも1つの色を持っている製品を選択しますしかし、

select * from products 
left join filters_to_products 
    on products.id = filters_to_products.product_id 
where filters_to_products.filter_id in (1,2,3,4); 

上記のクエリ:サイズのセットは、それゆえWHERE IN句は、基本的には、私の心に来るが、それは動作しません、なぜなら技術的には動作しますが間違いがありますが、タイプの色とサイズのフィルタが同じかっこで混在しているため、2つの異なるWHERE IN節を作成すると思います。

どうすればよいですか?ソリューションにはネストされたクエリと関連があると思います。もしそうなら、私はそれにどのようにアプローチすべきですか?

+0

'filter_to_products'はテーブルであり、したがって、'、IN filter_to_products(1、 2,3,4)はナンセンスです。このクエリはそのまま実行されません。いくつかのサンプルデータと希望の結果を共有できれば、説明だけで必要なものが明確ではないため、より簡単にお手伝いできます。 – JNevill

+0

はフィルタまたはfilters_to_products構造を参照する必要があります。私はあなたがkey'dペアを使用しているか、どの列 'サイズ'と色がどのテーブルにあるのかわかりません。サンプルデータはいつもプラスの質問です。 – xQbert

+0

私は明らかに私の問題を述べました。私の質問は構文上の問題(質問を入力するときに作成される)とは関係ありません。 –

答えて

1

我々はF.Typeは少なくとも{サイズ、色}

の値を持っていると仮定した場合、私たちが行う必要があるすべては3つのテーブルを結合し、私達はこれらのタイプに基づいてフィルタリングすることを確認しています。次に、2のタイプのレコードの個数が確実に異なるようにします。これにより、少なくともサイズと色属性を持つ製品が保証されます。 あり、それが唯一同様にそれらの2を持っていることを確認する方法がありますが、私はそれが問題だとは思わない...まだ...

SELECT P.ID, P.Name 
FROM PRODUCTS P 
INNER JOIN FILTERS_TO_PRODUCTS FP 
on P.ID = FP.Product_ID 
INNER JOIN FILTERS F 
on F.ID = FP.Filter_ID 
WHERE F.Type in ('Size','Color') 
GROUP BY P.ID, P.Name 
HAVING Count(Distinct F.Type) = 2 
+0

私はいつも;しかし私はそれを逃した。もはや...うわー..いいえ、私は常にメンテナンスチームを混乱させるために、私の左の結合はインナーのように振る舞う。 (自分自身) – xQbert

+0

申し訳ありませんが、問題があります。特定のフィルタIDのセットはどうですか?あなたのクエリは、サイズと色の両方を持つ製品と一致しますが、フィルタIDに基づいてそれ以上一致しません。 –

+0

WHERE filter_id INの更新が必要です –