Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

दोस्तों और आपसी दोस्तों की संख्या खोजने के लिए MySQL क्वेरी

इस तरह से मित्र_आईडी फ़ील्ड पर मित्र_लिंक तालिका में स्वयं से जुड़कर पारस्परिक मित्र ढूंढे जा सकते हैं:

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 . में क्लॉज सेल्फ़-जॉइन द्वारा बनाए गए डेटा सेट के आकार को कम करने के लिए शर्तें और मेरे दूसरे उदाहरण की तरह सबक्वेरी के उपयोग को रोकें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं अपनी MySQL संग्रहीत प्रक्रिया में लेनदेन का उपयोग कैसे कर सकता हूं?

  2. शेल स्क्रिप्ट में डेटाबेस बनाएं - PHP से कन्वर्ट करें

  3. MySQL 1062 - कुंजी 'प्राथमिक' के लिए डुप्लिकेट प्रविष्टि '0'

  4. क्या mysql_real_escape_string () पूरी तरह से SQL इंजेक्शन से बचाव करता है?

  5. जावा MySQL ने स्टेटमेंट बैच तैयार किया