3

对于每个喜欢学生 B 的学生 A 并且两人不是朋友,找出他们是否有共同的朋友 C(谁能介绍他们!)

我有桌子

 Friend (ID1, ID2) 

 Likes(ID1, ID2)

我需要从没有朋友的 Likes 中选择一对 id。

我已经做到了

    SELECT L.id1 id1, L.id2 id2
 FROM likes L
 LEFT JOIN friend F ON (L.id1 = F.id1 and L.id2 = F.id2)
 WHERE F.id1 IS NULL

如何找到共同的好友ID?

4

1 回答 1

1

我们需要找到满足以下条件的所有元组:

  1. 甲喜欢乙
  2. A 和 C 是朋友
  3. B和C是朋友
  4. A 与 B 不是朋友,B 与 A 不是朋友

完成此操作的查询将是这样的:

SELECT L.ID1 as Liker, L.ID2 as Liked, F1.ID2 as MutualFriend
FROM Likes L, Friend F1, Friend F2 
WHERE F1.ID2 = F2.ID2
AND F1.ID1 = L.ID1
AND F2.ID1 = L.ID2
AND NOT EXISTS(
    SELECT * FROM FRIEND F3
    WHERE (F3.ID1 = L.ID1 AND F3.ID2 = L.ID2)
    OR (F3.ID1 = L.ID2 AND F3.ID2 = L.ID1));

PS 我只在 sqlite3 中测试过,所以在另一个 DBMS 中可能会有轻微的语法错误,但我不这么认为。此外,我的答案返回的答案比共同的朋友 ID 更易读。

希望有帮助,

于 2013-01-19T23:30:20.623 回答