0

いくつかの材料を入力として取り、データベースでいくつかのレシピを検索し、入力として提供された材料のすべてまたは一部を必要とするレシピを返す Web サービスを実装しようとしています。

レシピと材料の間の多対多の関係を簡単に把握できるので、レシピ用のテーブル、材料用のテーブル、および中間のリンク テーブルを作成する予定です。ただし、これを行うと、必要な情報を取得するために効率的な方法でテーブルをクエリする方法がわかりません。

明確な例を挙げるには、次のことを考慮してください。

入力: パスタ、チキン、ペスト、トマト 出力は次のようになります。

  • チキンのトマトソースパスタ (パスタ、チキン、トマトが必要)
  • オーブンでペストを使ったパスタ (パスタとペストが必要)

ただし、アウトプットにはチキンとポテトのトマトソースは含まれません (入力材料にポテトがないため)。

これを Java と MySQL に実装します (Java の部分はおそらくこの質問には重要ではありません)。

これに近づくのを手伝ってくれる人がいますか。私は実際にクエリを実装する方法を検討していますが、他の方法でクエリにアプローチできると考えられる場合は、それらも大歓迎です。

前もって感謝します

4

1 に答える 1

1

まず、「必要な」材料のリストを一時的なテーブルに入れます。これを「望ましい」と呼びましょう。

次のクエリは、目的のテーブルの材料のみを含むレシピを検索します。

select r.recipe.name, group_concat(i.ingredientname separator ', ') as ingredients,
       count(*) as numingredients
from RecipeIngredient ri join
     Recipe r
     on ri.recipeid = r.recipeid join
     Ingredient i
     on ri.ingredientid = i.ingredientid left outer join
     Desired d
     on i.ingredientname = d.ingredientname
group by r.recipe.name
having max(case when d.ingredientname is null then 1 else 0 end) = 0 -- all ingredients in list
于 2012-08-27T18:14:07.653 に答える