2

配列内のすべてのアイテムと一致する場合、テーブルからすべての productID を取得しようとしているときに問題に直面しています。この場合、ユーザーが検索したすべての成分が含まれている場合にのみ製品を返します。

表はこんな感じ

    ID  produktID   ingredientID
    ----------------------------
    1      418           1
    2      418           2
    3      418           3
    4      416           4
    5      411           1
    6      411           5
    7      411           6

主な情報が格納されている製品テーブルからこのテーブルを結合します。クエリの目的は、すべての成分 ID が指定された配列と一致する場合にのみ、製品 ID を取得することです。使用してみましWHERE ingredientID IN(1,5,6)たが、常に OR ステートメントであることが判明し、成分のいずれかが一致するすべての ID が返されます。たとえば、(1,5,6) または (5,6) を渡すと製品 ID 411 が返されますが、(2,5,6) を渡すと返されません。

私が試したクエリは次のようになります (簡略化すると、ブランドやカテゴリなどの他の関係への 5 方向の結合の一部です)

SELECT productID FROM products_ingredients_mm WHERE ingredientID IN (1,5,6) GROUP BY productID

しかし、結果には 418 も含まれています。一致させるにはどうすればよいですか?問題をわかりやすい方法で説明できたことを願っています。質問するために頭を悩ませるのは本当に難しいです。

4

2 に答える 2

3

これを関係分割と呼びます。

SELECT  produktID
FROM    tableName
WHERE   ingredientID IN (1,5,6)
GROUP   BY produktID
HAVING  COUNT(*) = 3

一意の制約がingredientIDすべてproduktIDに適用されていない場合は、使用する必要がありますDISTINCT

SELECT  produktID
FROM    tableName
WHERE   ingredientID IN (1,5,6)
GROUP   BY produktID
HAVING  COUNT(DISTINCT ingredientID) = 3

その他のソース

于 2013-01-17T15:19:05.073 に答える
2

これを試して:

SELECT pi.productID, p.productName
FROM products_ingredients_mm pim 
INNER JOIN products p ON pim.productID = p.productID 
WHERE ingredientID IN (1,5,6)
GROUP BY productID
HAVING COUNT(DISTINCT ingredientID) = 3
于 2013-01-17T15:24:12.017 に答える