यहां जॉइन का उपयोग करके चौड़ाई-प्रथम, सबसे छोटी पथ खोज का उपयोग करके खोज करने का तरीका बताया गया है। इस एल्गोरिथम में कोई जादू नहीं है, क्योंकि हम अपना उत्तर खोजने के लिए MySQL का उपयोग कर रहे हैं, और हम किसी भी प्रकार के अनुमान या अनुकूलन का उपयोग करने वाले किसी फैंसी खोज एल्गोरिथ्म को शामिल नहीं कर रहे हैं।
मेरे 'मित्र' तालिका में यूनिडायरेक्शनल संबंध हैं, इसलिए हमारे पास इस अर्थ में डुप्लीकेट हैं कि '1 से 2' और '2 से 1' दोनों संग्रहीत हैं। मैं is_active को भी बाहर कर रहा हूं क्योंकि कार्यान्वयन स्पष्ट होगा:
ये रहा डेटा:
member_id friend_id
1 2
1 3
1 4
2 1
2 3
2 5
2 6
3 2
3 1
4 1
5 2
6 2
6 7
7 6
7 8
8 7
हमारे पास सदस्य 1 चुना गया है, और हम पूछ रहे हैं कि क्या 7 के साथ 1 मित्र है, किसी मित्र का मित्र, आदि? 0 की गिनती का मतलब है नहीं, और 1 की गिनती का मतलब हां है।
SELECT COUNT(*)
FROM friends f1
WHERE f1.member_id = 1
AND f1.friend_id = 7
अगर नहीं, तो क्या वे किसी दोस्त के दोस्त हैं?
SELECT COUNT(*)
FROM friends f1
JOIN friends f2
ON f2.member_id = f1.friend_id
WHERE f1.member_id = 1
AND f2.friend_id = 7
अगर नहीं, तो दोस्त के दोस्त का दोस्त?
SELECT COUNT(*)
FROM friends f1
JOIN friends f2
ON f2.member_id = f1.friend_id
JOIN friends f3
ON f3.member_id = f2.friend_id
WHERE f1.member_id = 1
AND f3.friend_id = 7
और इसी तरह...
तीसरी क्वेरी में '1 से 2', '2 से 6' और '6 से 7' का पथ मिलेगा, जो 1 की गिनती लौटाएगा।
प्रत्येक क्वेरी अधिक महंगी हो जाती है (बड़ी संख्या में जुड़ने के कारण), इसलिए आप किसी बिंदु पर खोज को सीमित करना चाह सकते हैं। एक अच्छी बात यह है कि यह खोज दोनों छोर से बीच की ओर काम करती है, जो कि सबसे छोटी पथ खोजों के लिए सुझाया गया एक सरल अनुकूलन है।
सदस्य 1 के लिए उन पारस्परिक मित्र अनुशंसाओं को खोजने का तरीका यहां दिया गया है:
SELECT f2.friend_id
FROM friends f1
JOIN friends f2
ON f2.member_id = f1.friend_id
LEFT JOIN friends f3
ON f3.member_id = f1.member_id
AND f3.friend_id = f2.friend_id
WHERE f1.member_id = 1
AND f2.friend_id <> f1.member_id // Not ourself
AND f3.friend_id IS NULL // Not already a friend