2017-11-23 3 views
2

私のデータベースには以下の3つのテーブルがあり、私が望む結果を得るためにいくつかの問題を抱えています。私は食材でレシピを検索しようとしています。レシピデータベース、成分による検索

SQLフィドル:ここFiddle

は私のテーブルです: 成分

+---------------+---------+ 
| ingredient_id | name | 
+---------------+---------+ 
|    1 | tomato | 
|    2 | onion | 
|    3 | rice | 
|    4 | chicken | 
|    5 | beef | 
|    6 | noodles | 
|    7 | salt | 
+---------------+---------+ 

レシピ

+-----------+------------------+ 
| recipe_id | name    | 
+-----------+------------------+ 
|   1 | tomato goodness | 
|   2 | meat deluxe  | 
|   3 | chicken surprise | 
+-----------+------------------+ 

Ingredient_Index

+-----------+---------------+ 
| recipe_id | ingredient_id | 
+-----------+---------------+ 
|   1 |    1 | 
|   1 |    5 | 
|   1 |    7 | 
|   2 |    5 | 
|   2 |    6 | 
|   2 |    7 | 
|   3 |    4 | 
|   3 |    3 | 
|   3 |    7 | 
+-----------+---------------+ 

私が達成したいのは、指定された成分を使って作ることができるすべてのレシピをフィルターにかけることです。そして、ここで問題が来る:

このクエリ:私はレシピのいずれかを行うのに十分な材料を持っていないので、

select DISTINCT r.name 
from 
    recipes r 
    inner join ingredient_index i 
    on i.recipe_id = r.recipe_id 
where i.ingredient_id IN (2, 7, 5); 

は、私の誤った結果が得られますが、それでも私は、私はすべてを作ることができる結果を得ますそのうちの。それはrecipe_idIngredient_Indexのテーブルが複製されているために発生します。

何か助けていただければ幸いです。

+1

すべての成分を計量するか、成分が欠けていないことを確認してください。 – jarlh

+0

どうすればいいか教えてください。私はこれを理解するのに苦労している。 – Deividas

+0

それは非常に興味深い質問でした。私は学生の次のテストに入れます:-) – Cynical

答えて

1

jarlhが言ったように、不足している何の成分をチェックしません:

select DISTINCT r.name 
from recipes r 
where not exists (
select 1 from ingredient_index i where r.recipe_id=i.recipe_id and i.ingredient_id not in (2,5,7) 
) 
+0

それは、私ではなく、言った** jarih **だった。とにかく、あなたの両方のために超高速と私のニーズの対応を果たしてくれてありがとう。 – Deividas

0

鉱山が与えたjarlh他の提案に従い、すべての成分が用意されていたか否かをチェック:

select distinct a.name 
from (select r.name, count(*) as ing_available 
     from 
      recipes r 
      inner join ingredient_index i 
      on i.recipe_id = r.recipe_id 
     where i.ingredient_id IN (1, 7, 5) 
     group by r.recipe_id) 
as a join 
     (select r.name, count(*) as ing_required 
     from 
      recipes r 
      inner join ingredient_index i 
      on i.recipe_id = r.recipe_id 
     group by r.recipe_id) 
as p 
on p.ing_required = a.ing_available 
0

別の方法:

select r.name 
from recipes r 
    join ingredient_index i on i.recipe_id = r.recipe_id 
where i.ingredient_id IN (2, 7, 5) 
group by r.name 
having count(i.ingredient_id) = 3 
+0

私はこれを前に試しました。それは機能しませんし、私は材料の異なる量のレシピを持っています。 – Deividas

+0

まあ、私はあまりにも遅く入力して以来、私は本当に他の良い答えが投稿されたときにそれを仕上げるインスピレーションを感じなかった。 – jarlh

+0

それはすべて良いです、私は多くのあなたの気持ちに感謝します。 – Deividas

関連する問題