Бих предложил да съхраните броя на съставките за рецептата в таблицата с рецепти, само за по-голяма ефективност (това ще направи заявката по-бърза, ако не се налага да изчислява тази информация всеки път). Това е денормализация, която е лоша за целостта на данните, но добра за производителността. Трябва да сте наясно, че това може да доведе до несъответствия в данните, ако рецептите се актуализират и не внимавате да се уверите, че номерът е актуализиран на всяко подходящо място. Предполагам, че сте направили това с новата колона, зададена като ing_count в таблицата с рецепти.
Уверете се, че сте избягали от стойностите в за NAME1, NAME2 и т.н., ако са предоставени чрез въвеждане от потребителя - в противен случай сте изложени на риск от 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
Ако не искате да съхранявате броя на рецептите, можете да направите нещо подобно:
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