4

製品カテゴリ ページのファセットに基づいて製品を選択しようとしています。

基本的な構造は次のとおりです。

製品_ファセット
--------------------------------
UID ProductID FacetID FacetOptionID
 1 1 1 1
 2 1 1 2
 3 1 2 4
 4 1 2 7
製品
--------------------------------
商品ID 商品名
    1 いくつかのウィジェット

ユーザーが選択したすべてのファセットに対して正しい値に設定されたファセット レコードを持つすべての製品を選択したいと考えています。

ファセット
ID 1 を値 6 に設定 AND
ファセット ID 2 を値 97 に設定 AND
ファセット ID 5 を値 43 に設定 AND

特定の製品のファセット テーブルにあるすべてのファセット レコードを持つ製品テーブルからすべての製品を取得するクエリが必要です。クエリは、一部の要件のみを満たす製品を返すべきではありません。

having 句内でサブクエリを実行する必要があると思いますが、それがどのように構造化されるのかわかりませんか?

4

2 に答える 2

3

1 つの方法は、リクエストに基づいて動的に生成できる EXISTS 句を使用することです。

select p.*
from Products p 
where 
   exists (select 1 from Product_Facets where ProductID = p.ProductID
                                        and FacetID = 1
                                        and FacetOptionID= 6)
and
   exists (select 1 from Product_Facets where ProductID = p.ProductID
                                        and FacetID = 2
                                        and FacetOptionID= 97)
and
   exists (select 1 from Product_Facets where ProductID = p.ProductID
                                        and FacetID = 3
                                        and FacetOptionID = 43)

もう 1 つの方法は、単純な内部結合です (これも簡単に動的に生成されます)。

select p.*
from Products p
join Product_Facets f1 on p.ProductID = f1.ProductID
         and f1.FacetID = 1 and f1.FacetOptionID = 6
join Product_Facets f2 on p.ProductID = f2.ProductID
         and f2.FacetID = 2 and f2.FacetOptionID = 97
join Product_Facets f3 on p.ProductID = f3.ProductID
         and f3.FacetID = 3 and f3.FacetOptionID = 43

どちらの方法でも、要求された FacetID および FacetOptionID ごとに Product_Facets レコードが存在する Products からレコードのみが返されます (これは、あなたが言及した Value フィールドであると思います)。

于 2011-06-07T15:05:13.947 に答える
0

選択した基準と正確に等しい HAVING カウントに一致して適用するエンティティに対してのみ、ファセット テーブルから事前クエリを実行し、それを製品テーブルに結合します。

最初の「PreQuery」は、各行を個別にテストする際に各組み合わせに「OR」を適用しますが、HAVING 句により、3 つの条件すべてが適切に修飾されていることが保証されます。

SELECT STRAIGHT_JOIN
      P.*
   FROM
      ( select pf.ProductID,
               count(*) as MatchedCriteria
           from
              Product_Facets pf
           where
                 (pf.FacetID = 1 AND FacetOptionID = 6 )
              OR (pf.FacetID = 2 AND FacetOptionID = 97 )
              OR (pf.FacetID = 5 AND FacetOptionID = 43 )
           group by
              pf.ProductID
           having
              count(*) = 3 ) PreQuery

      Join Products p
         on PreQuery.ProductID = p.ProductID
   order by
      p.ProductName
于 2011-06-07T15:38:28.080 に答える