0

これが私の現在のセットアップです。 RECIPEINGREDIENTS
の 2 つのテーブルがあります。RECIPEは、他のデータとともにIDを保持します。INGREDIENTSには、各 RECIPE に必要な X 行があります。 少なくとも 2 つの一致する材料を使用して 2 つのレシピを一致させるにはどうすればよいでしょうか? どの成分が一致する必要があるかを指定することはできますが、私の問題は、レシピに 10 個を超える成分があり、同じ 2 つの成分を使用する 2 つのレシピが必要で、どれがどれかわからない場合です。 申し訳ありませんが、私の英語は私の自然言語ではありません。必要に応じて、または十分に明確でない場合は、詳細を投稿します。 実際の例: レシピ 1 には、魚、じゃがいも、塩が含まれています。 レシピ 2 には、七面鳥と米が含まれています。








レシピ 3 には、魚、米、塩が含まれます。
レシピ 4 には、七面鳥肉、じゃがいも、塩が含まれています。

レシピ 1 に基づく結果: 4
レシピ 2 に基づく結果: なし
レシピ 3 に基づく結果: 1
レシピ 4 に基づく結果: 1
(はい、フィルターに基づいてすべてのレシピを実行する必要があります。ここで説明)

4

2 に答える 2

2

次のようなことを試してください:

WITH REC_ING AS (
SELECT *
FROM RECIPE AS T1
INNER JOIN
INGREDIENTS AS T2
ON T1.ID = T2.ID)

SELECT *
FROM (
SELECT T1.ID AS ID1, T2.ID AS ID2
FROM REC_ING AS T1
INNER JOIN
REC_ING AS T2
ON T1.INGREDIENT_ID = T2.INGREDIENT_ID 
AND T1.ID != T2.ID) AS JOINED_TAB
GROUP BY ID1, ID2
HAVING COUNT(*) >= 2

これはラフコピーです。あなたが探しているもののように聞こえる場合は、より複雑な例を作成できます (SQL Fiddle を含む)。

于 2012-10-13T22:19:39.083 に答える
1

これを 2 つ以上の構成要素に拡張する必要がある場合、または問題領域の詳細な説明と代替クエリが存在する場合は、RELATIONAL DIVISIONに関するこの拡張記事を参照してください。


select DISTINCT A.recipe_id, C.recipe_id other_recipe_id
from INGREDIENTS A
join INGREDIENTS B on A.recipe_id = B.recipe_id and A.ingredient < B.ingredient
join INGREDIENTS C on A.recipe_id < C.recipe_id and C.ingredient = A.ingredient
join INGREDIENTS D on C.recipe_id = D.recipe_id and D.ingredient < B.ingredient

A と B は、同じレシピに属する 2 つの異なる材料です。これらを使用して、同じ 2 つの成分 (A=C、B=D) である C と D を結合しますが、C と D は同じ他のレシピに属します。

これにより、2 つの材料を共有するレシピのすべてのペアの個別の ID が返されます。名前のレシピ テーブルに 2 回参加することで、実際のレシピ名を取得できます。

于 2012-10-13T22:19:53.007 に答える