मैं केवल दक्षता के लिए नुस्खा तालिका में नुस्खा के लिए सामग्री की संख्या की गिनती को संग्रहीत करने का सुझाव दूंगा (यदि यह हर बार इस जानकारी की गणना करने की आवश्यकता नहीं है तो यह क्वेरी को तेज कर देगा)। यह डीनॉर्मलाइजेशन है, जो डेटा अखंडता के लिए बुरा है लेकिन प्रदर्शन के लिए अच्छा है। आपको पता होना चाहिए कि यदि व्यंजनों को अपडेट किया जाता है तो इससे डेटा विसंगतियां हो सकती हैं और आप यह सुनिश्चित करने के लिए सावधान नहीं हैं कि प्रत्येक प्रासंगिक स्थान पर नंबर अपडेट किया गया है। मैंने मान लिया है कि आपने इसे रेसिपी टेबल में 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