Saya sarankan menyimpan hitungan jumlah bahan untuk resep di tabel resep, hanya demi efisiensi (itu akan membuat kueri lebih cepat jika tidak harus menghitung informasi ini setiap saat). Ini adalah denormalisasi, yang buruk untuk integritas data tetapi bagus untuk kinerja. Anda harus menyadari bahwa ini dapat menyebabkan inkonsistensi data jika resep diperbarui dan Anda tidak berhati-hati untuk memastikan nomor diperbarui di setiap tempat yang relevan. Saya berasumsi Anda telah melakukan ini dengan set kolom baru sebagai ing_count di tabel resep.
Pastikan Anda keluar dari nilai untuk NAME1, NAME2, dll jika diberikan melalui input pengguna - jika tidak, Anda berisiko terkena injeksi 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
Jika Anda tidak ingin menyimpan jumlah resep, Anda dapat melakukan sesuatu seperti ini:
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