इस तरह से मित्र_आईडी फ़ील्ड पर मित्र_लिंक तालिका में स्वयं से जुड़कर पारस्परिक मित्र ढूंढे जा सकते हैं:
SELECT *
FROM friend_links f1 INNER JOIN friend_links f2
ON f1.friend_id = f2.friend_id
WHERE f1.user_id = $person1
AND f2.user_id = $person2
लेकिन ध्यान रखें कि यह, सबसे खराब स्थिति में, अनिवार्य रूप से स्क्वायरिंग . है मित्र_लिंक तालिका में पंक्तियों की संख्या और पंक्तियों की एक गैर-तुच्छ संख्या होने पर आपके सर्वर को आसानी से जैक कर सकते हैं। एक बेहतर विकल्प यह होगा कि प्रत्येक उपयोगकर्ता के लिए 2 उप-प्रश्नों का उपयोग करें और फिर उनके परिणामों में शामिल हों।
SELECT *
FROM (
SELECT *
FROM friend_links
WHERE user_id = $person1
) p1 INNER JOIN (
SELECT *
FROM friend_links
WHERE user_id = $person1
) p2
ON p1.friend_id = p2.friend_id
साथ ही, आप सरोगेट कुंजी link_id
को हटाकर अपनी मित्र_लिंक तालिका को सरल बना सकते हैं और बस (user_id,friend_id)
making बना रहे हैं प्राथमिक कुंजी क्योंकि वे वैसे भी अद्वितीय होने चाहिए।
संपादित करें:
SELECT f2.user_id, COUNT(*) 'friends_in_common'
FROM friend_links f1 LEFT JOIN friend_links f2
ON f1.friend_id = f2.friend_id
WHERE f1.user_id = $person
GROUP BY f2.user_id
ORDER BY friends_in_common DESC
LIMIT $number
मैं यह भी सोच रहा हूं कि user_id
बाधाओं को WHERE
. से स्थानांतरित किया जा सकता है JOIN
. में क्लॉज सेल्फ़-जॉइन द्वारा बनाए गए डेटा सेट के आकार को कम करने के लिए शर्तें और मेरे दूसरे उदाहरण की तरह सबक्वेरी के उपयोग को रोकें।