Ich würde vorschlagen, die Anzahl der Zutaten für das Rezept aus Gründen der Effizienz in der Rezepttabelle zu speichern (es beschleunigt die Abfrage, wenn diese Informationen nicht jedes Mal berechnet werden müssen). Dies ist eine Denormalisierung, die schlecht für die Datenintegrität, aber gut für die Leistung ist. Sie sollten sich bewusst sein, dass dies zu Dateninkonsistenzen führen kann, wenn Rezepte aktualisiert werden und Sie nicht darauf achten, dass die Nummer an jeder relevanten Stelle aktualisiert wird. Ich bin davon ausgegangen, dass Sie dies mit der neuen Spalte getan haben, die als ing_count in der Rezepttabelle festgelegt wurde.
Stellen Sie sicher, dass Sie die Werte für NAME1, NAME2 usw. mit Escapezeichen versehen, wenn sie über Benutzereingaben bereitgestellt werden - andernfalls besteht die Gefahr einer SQL-Injektion.
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
Wenn Sie die Rezeptanzahl nicht speichern möchten, können Sie Folgendes tun:
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