Doporučil bych uložit počet ingrediencí pro recept do tabulky receptů, jen kvůli efektivitě (urychlí to dotaz, pokud nebude muset tuto informaci pokaždé počítat). Toto je denormalizace, která je špatná pro integritu dat, ale dobrá pro výkon. Měli byste si být vědomi toho, že to může způsobit nekonzistenci dat, pokud jsou receptury aktualizovány a nedbáte na to, aby bylo číslo aktualizováno na každém relevantním místě. Předpokládám, že jste to udělali s novým sloupcem nastaveným jako ing_count v tabulce receptů.
Ujistěte se, že jste escapovali hodnoty pro NAME1, NAME2 atd., pokud jsou poskytovány prostřednictvím uživatelského vstupu – jinak vám hrozí vložení SQL.
select recipe.rid, recipe.recipe_name, recipe.ing_count, count(ri) as ing_match_count
from recipe_ingredients ri
inner join (select iid from ingredients where i.name='NAME1' or i.name='NAME2' or i.NAME='NAME3') ing
on ri.iid = ing.iid
inner join recipe
on recipe.rid = ri.rid
group by recipe.rid, recipe.recipe_name, recipe.ing_count
having ing_match_count = recipe.ing_count
Pokud nechcete ukládat počet receptů, můžete udělat něco takového:
select recipe.rid, recipe.recipe_name, count(*) as ing_count, count(ing.iid) as ing_match_count
from recipe_ingredients ri
inner join (select iid from ingredients where i.name='NAME1' or i.name='NAME2' or i.NAME='NAME3') ing
on ri.iid = ing.iid
right outer join recipe
on recipe.rid = ri.rid
group by recipe.rid, recipe.recipe_name
having ing_match_count = ing_count