レシピは複数の材料を使用でき、指定された1つ以上の材料を使用するレシピを探しているため、DISTINCT
を使用する必要があります。 レシピが指定されたリストから複数の材料を使用している場合に重複する結果を防ぐためのキーワード。また、IN
を使用することもできます 複数の成分IDでフィルタリングする句。
select DISTINCT r.name
from
recipes r
inner join ingredient_index i
on i.recipe_id = r.recipe_id
where i.ingredient_id IN (7, 5);
または、リストで指定されたすべての材料を使用しているレシピを探している場合は、レシピ名で結果をグループ化し、レコードの数がリストの材料の数と同じかどうかを確認できます。
select r.name
from
recipes r
inner join ingredient_index i
on i.recipe_id = r.recipe_id
where i.ingredient_id IN (7, 5)
GROUP BY r.name
HAVING COUNT(*) = 2
これは、同じ(recipe_id、component_id)タプルを持つ重複レコードがないことを前提としています(UNIQUE制約でより確実になります)。