ما هي طرق الحصول على أصدقاء مشتركين في (1, 2) (2, 1) سيناريو الصداقة?

StackOverflow https://stackoverflow.com//questions/9663607

  •  12-12-2019
  •  | 
  •  

سؤال

أنا تطوير موقع على شبكة الانترنت حيث عندما يضيف شخص شخص آخر كصديق, 2 يتم إنشاء إدخالات.دعنا نقول uid 1 يضيف uid 2 كصديق ، يتم إنشاء الصفوف التالية في الخلية.

activity_id   uid1 uid2
     1         1     2
     2         2     1

uid 2 يصبح أصدقاء مع uid 3:

activity_id   uid1 uid2
     1         1     2
     2         2     1
     3         2     3
     4         3     2

ما هي الطرق للحصول على أصدقاء مشتركون بين uid 1 و uid 2?أنا باستخدام فب و ميسكل مع أي خبرة بدو (في الوقت الراهن).

[عدل] حسنا ، لذلك قررت تنظيم / تطبيع الجداول.العلاقة يولد فقط 1 صف الآن.مما يجعل الجدول:

activity_id   uid1 uid2
     1         1     2
     2         2     3
هل كانت مفيدة؟

المحلول

بالنظر إلى تنسيق الجدول من سؤال آخر, ، يجب أن يفعل هذا ما تريد;

SELECT name FROM users u
JOIN friends f1
  ON u.uid = f1.uid OR u.uid = f1.fid
JOIN friends f2
  ON u.uid = f2.uid OR u.uid = f2.fid
WHERE (f1.uid=1 OR f1.fid=1) AND (f2.uid=3 OR f2.fid=3) 
  AND u.uid<>1 AND u.uid<>3;

عرض هنا.

نصائح أخرى

على افتراض كنت قد دعا الجدول الخاص بك 'الأصدقاء'.

سيجد هذا الاستعلام أصدقاء مشتركين للمستخدمين 1 و 3.

SELECT a.uid2
  FROM friends a
    INNER JOIN friends b
       ON a.uid2 = b.uid2
  WHERE a.uid1 = 1
   AND b.uid1 = 3

لا تظن أنه قد يكون قليلا الافتراض لجعل 2 الصفوف على الرغم من?ربما إيد 2 لا يحب حقا إيد 1 ?(أوتي).

للعثور على جميع الأصدقاء المشتركين uid 1 و uid 2:

SELECT t1.uid2
FROM   tbl t1
JOIN   tbl t2 USING (uid2)
WHERE  t1.uid1 = 1
AND    t2.uid1 = 2;

هناك حالة خاصة واحدة, على أية حال:لا يظهر هذا الاستعلام ما إذا كان 1 & 2 هم أصدقاء!

راجع للشغل ، يبدو التصميم الخاص بك زائدة عن الحاجة قليلا.يجب أن تعمل مع إدخال واحد فقط لكل صداقة.(هذا الاستعلام يجب أن تتكيف مع ذلك ، على الرغم من.)

أساسا هذا هو حالة أخرى من التقسيم العلائقي.هناك العديد من الطرق المختلفة لجلد هذه القطة. البحث تماما تحت هذا السؤال ذات الصلة - بما في ذلك اختبار الأداء ومزيد من المعلومات.


الاستعلام عن سؤال محدث

الآن هناك فقط 1 صف لكل صداقة-يمكن للمستخدم أن يطفو على السطح في أي عمود:

SELECT uid
FROM (
    SELECT uid2 AS uid FROM tbl WHERE uid1 = 1
    UNION ALL
    SELECT uid1        FROM tbl WHERE uid2 = 1
    ) u1
JOIN (
    SELECT uid2 AS uid FROM tbl WHERE uid1 = 2
    UNION ALL
    SELECT uid1        FROM tbl WHERE uid2 = 2
    ) u2 USING (uid)
$query="SELECT distinct(uid2) FROM `test` where uid1=$uid union select distinct(uid1) from test where uid2=$uid";
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top