1

タイトルがどういうわけか意味があることを願っています。

DBに3つのテーブルがあります。1つ目はproduct_variantレコードを保持し、2つ目はlabelレコードを保持し、3つ目はrefその間のテーブルです。

  • product_variant:(id、productId、serviceProviderId)。
  • label:(id、label)。
  • product_variant_label_ref:(label_id、variant_id)。

クエリの入力パラメータは次のとおりです。productTypeserviceProviderIdおよびラベルのセット。私の目的はproduct_variant、入力パラメータに基づいてテーブル内の行を選択することです。

これは、休止状態のxmlファイルでの私のクエリです。

 SELECT v.*
 FROM product_variant v
     INNER JOIN product_variant_label_ref r ON v.id = r.variant_id
     INNER JOIN product_product p ON p.productType = :productType
     INNER JOIN product_label l ON l.id = r.label_id
     WHERE v.product_id = p.id
        AND v.serviceprovider_id = :serviceProviderId
        AND l.label in (:labels)

問題は、IN演算子を使用すると、選言的なOR選択ANDが行われ、その間に必要なことです。入力として異なるラベルを指定する場合、product_variantrefテーブルを介してそれらすべてに関係がある行のみが必要です。入力ラベルの1つがいずれにも属していない場合product_variant、クエリは何も返さないはずです。誰かが私のクエリを変更するのを手伝ってもらえますか?

4

1 に答える 1

2

各商品について返された行を数え、それをラベルパラメータのアイテム数と一致させる必要があります

たとえば、labelsパラメータに3つのラベルがある場合...

 SELECT v.id
 FROM product_variant v 
     INNER JOIN product_variant_label_ref r ON v.id = r.variant_id 
     INNER JOIN product_product p ON p.productType = :productType 
     INNER JOIN product_label l ON l.id = r.label_id 
     WHERE v.product_id = p.id 
        AND v.serviceprovider_id = :serviceProviderId 
        AND l.label in (:labels) 
 GROUP BY v.id
 HAVING COUNT(DISTINCT l.id) = 3 -- ie: Length of labels
于 2012-09-06T09:12:58.907 に答える