-1

レシピ データベースと見なすことができるデータベースがある場合、特定の材料で作成できるレシピのすべての ID を選択するにはどうすればよいですか。たとえば、材料 1 と 4 がある場合、3 が返されます。それを使って作れるレシピ。

約 50 種類の材料と、さらに多くのレシピがあります。

UNION/いくつかの結合を使用するなど、いくつかの可能性があると思います...しかし、この問題に対する簡単で単純な解決策はわかりません。

Recipes   Recipes/Ingredients    Ingredients
   1            1  1                  1
   2            1  2                  2
   3            2  1                  3
                2  3                  4
                2  4
                3  1
                3  4

編集/

それを解決するために私が考えたこと:

select recipe_id from Recipes
where recipe_id in ( 
    select recipe_id from Recipes_Ingredients where ingredient_Id = 1
    UNION
    select recipe_id from Recipes_Ingredients where ingredient_Id = 4
)

私のデータベースは実際には成分に関するものではなく、これらのものを50以上含む可能性のあるものに関するものであるため、これは非常に長いクエリにつながります.

4

2 に答える 2

2

これを試してください(列名を推測しようとしました):

テーブル レシピ : Recipe_id

テーブル Recipes_Ingredients : レシピ | 材料

  SELECT Recipe_id FROM Recipes   
  EXCEPT (
    SELECT DISTINCT Recipes FROM Recipes_Ingredients
    WHERE Ingredients NOT IN (1,4)  
  )

これについて説明します。「材料を1つ以上持っているレシピ」(ここでは1,4)を知りたい場合:

SELECT DISTINCT Recipes FROM Recipes_Ingredients
WHERE Ingredients IN (1,4)

したがって、逆に「どのレシピができないか」は、少なくとも 1 つの材料が欠けているためです。

SELECT DISTINCT Recipes FROM Recipes_Ingredients
WHERE Ingredients NOT IN (1,4)  

次に、できないレシピを除いて、すべてのレシピを取り上げます。

SELECT recipe_id FROM Recipes   
  EXCEPT (
    SELECT DISTINCT Recipes FROM Recipes_Ingredients
    WHERE Ingredients NOT IN (1,4)  
  )
于 2013-03-13T14:30:19.877 に答える
1

試す:

select recipe_id
from recipes_ingredients
group by recipe_id
having count(*)=sum(case when ingredient_id in (1,4) then 1 end)
于 2013-03-13T14:39:11.907 に答える