ठीक है, एकमात्र प्रश्न जो अब तक काम कर सकता है वह साइमन है ... लेकिन यह वास्तविक ओवरकिल है - इतनी जटिल ग़लत क्वेरी (2 यूनियनों के साथ 2 उपश्रेणियां!) इतनी सरल चीज़ के लिए कि आपको एक इनाम रखने की आवश्यकता है? :-) और अगर आपके पास 1000+ उपयोगकर्ता हैं तो क्वेरी नरक के रूप में धीमी होगी - याद रखें, यह द्विघात है, और सबक्वेरी में यूनियनों के कारण, शायद ही किसी इंडेक्स का उपयोग किया जाएगा!
मेरा सुझाव है कि डिज़ाइन पर फिर से विचार करें और दोस्ती के लिए 2 डुप्लिकेट पंक्तियों की अनुमति दें:
id Person1 Person2 status
1 1 2 friend
2 2 1 friend
3 1 3 friend
4 3 1 friend
आप सोच सकते हैं कि यह अक्षम है, लेकिन सरलीकरण का पालन करने से क्वेरी को साधारण जॉइन में फिर से लिखने की अनुमति मिलेगी:
select f1.Person2 as common_friend
from friends as f1 join friends as f2
using (Person2)
where f1.Person1 = '$id1' and f2.Person1 = '$id2'
and f1.status = 'friend' and f2.status = 'friend'
जो नर्क के समान तेज़ होगा! (व्यक्ति 1,2 के लिए सूचकांक जोड़ना न भूलें।) सबक्वायरी टू जॉइन) अन्य बहुत खराब डेटा संरचना में और इसने क्वेरी को गति दी है अनंत काल से ब्लिट्ज-तत्काल तक!
तो जो एक बड़ा ओवरहेड लग रहा था (एक दोस्ती के लिए 2 पंक्तियाँ) वास्तव में एक बड़ा अनुकूलन है :-)
साथ ही, यह "X के सभी दोस्तों को ढूंढें" जैसे प्रश्नों को और अधिक आसान बना देगा। और अधिक इनाम खर्च करने की आवश्यकता नहीं होगी :-)