1

私は次のテーブルを持っています:

Option
-------
id - int
name - varchar

Product
---------
id - int
name -varchar

ProductOptions
------------------
id - int
product_id - int
option_id - int

オプションIDのリストがある場合、自分が持っているIDのリストを使用して、すべてのオプションを持つすべての製品を取得するにはどうすればよいですか?SQL「IN」は「OR」を使用することを知っています。「AND」が必要です。ありがとうございました!

4

4 に答える 4

1

IDが繰り返されていない場合は、必要なオプションのIDを取得して、その数を数えることができます。次に、あなたはただ

SELECT product_id FROM ProductOptions
    WHERE option_id IN ( OPTIONS )
    GROUP BY product_id
    HAVING COUNT(product_id) = NEEDED;

GROUP BYがない場合、5つのオプションIDがあり、製品27に15のオプションがあり、そのうち5つがあった場合、同じproduct_idを持つ5つの行が得られます。GROUPBYはそれらの行を結合します。すべてのオプションが必要であり、オプションにはすべて異なるIDがあるため、「すべてのオプションを含む行」を尋ねるのは、「目的のオプションセットのサイズと同じ数のオプションを含む行」を尋ねるのと同じです。

さらに、ProductOptionsでのみ大きなクエリを実行します。これは非常に高速である必要があります。

于 2012-08-21T17:40:13.670 に答える
1

このようなクエリにアプローチする1つの方法は、groupby句とhave句を使用することです。リスト内の必要なオプションのリストから始めるのが最善です。

with list as (
    select <optionname1> as optionname union all
    select <optionname2 union all . . .
   )
select ProductId
from list l left outer join
     Options o
     on l.optionname = o.name
     ProductOptions po join
     on po.option_id = o.option_id left outer join
group by ProductId
having count(distinct o.optionname) = count(distinct l.optionname)

これにより、すべてがリストに含まれることが保証されます。ちなみに、私はSQLServer構文を使用してリストを生成しました。

区切り文字列など、他の形式のリストがある場合は、他のオプションがあります。使用しているデータベースによっては、他の可能性もあります。ただし、上記のアイデアは、2つの注意点がありますが、どのデータベースでも機能するはずです。

  • withステートメントは、「list」が存在するFROM句のサブクエリになる可能性があります。
  • リスト(定数の表)の作成方法はデータベースによって異なります
于 2012-08-21T17:40:24.537 に答える
1

IDのリストがある場合、基本的に2つのオプションしかありません。
-できるだけ多くのIDを選択して呼び出すか、
IN()またはORを使用する必要があります。

ただし、通常は1つのステートメントを呼び出す方がパフォーマンスが高いため、INの使用をお勧めします(さらに、すべてのid列にインデックスがある場合は、テーブルスキャンは必要ありません)。

私は次のステートメントを使用します:

select Product.* from Product, Option, ProductOption where Option.id IN ( 1, 2, ... ) and option.id = ProductOption.option_id and Product.product_id = Product.id

もう1つ、ProductOptionsテーブルにid列があるのはなぜですか。私の観点からは役に立たないので、product_id列とoption_id列の複合主キーを使用する必要があります(このカップルは一意であるため)。

于 2012-08-21T17:44:43.033 に答える
0

これは機能しますか?:

select p.id, p.name 
from Product as p inner join
 ProductOptions as po on p.id=po.product_id 
where po.option_id in (1,2,3,4)
于 2012-08-21T17:40:48.523 に答える