如何结识朋友的朋友......

时间:2015-02-24 09:39:14

标签: mysql sql

我想找朋友的朋友。我得到了结果,但我不确定我的查询是否正确。我正在使用嵌套选择。

我的问题是:

  1. 查询是否正确?

  2. 如何使用join进行此查询?

  3. 这是我的朋友表

    rowId  userId  friendId
    -----  ------  --------
    1      1       4
    2      1       2
    3      2       10
    4      3       6
    ..     ..      ..
    

    这就是我做朋友的方式:

    SELECT DISTINCT(friendId) FROM `user_friend`
    WHERE userId = $userID
    

    这就是我收到朋友的朋友

    SELECT DISTINCT(friendId) FROM `user_friend`
    WHERE userId IN (SELECT DISTINCT(friendId) FROM `user_friend`
                    WHERE userId = $userID)
    

    这是我为了结识朋友的朋友而做的事情

    SELECT DISTINCT(friendId) FROM `user_friend`
    WHERE userId IN (SELECT DISTINCT(friendId) FROM `user_friend`
                    WHERE userId IN (SELECT DISTINCT(friendId) FROM `user_friend`
                                    WHERE userId = $userID))
    

2 个答案:

答案 0 :(得分:2)

使用连接可能更容易......

SELECT DISTINCT u3.friendId FROM user_friend u1
   JOIN user_friend u2 ON u1.friendId = u2.userId
   JOIN user_friend u3 ON u2.friendId = u3.userId
   WHERE u1.userId = $userId

答案 1 :(得分:1)

这似乎是连贯的。

你唯一想念的是你不应该返回$ userId,它可以是朋友朋友的朋友

编辑:我不知道你的数据库是否已经包含友谊。因此你还必须考虑如果A是B的朋友,那么B是A的朋友并测试它。

所以你必须在t2中使用可能的反转,如下面的

 SELECT t1.userId FROM user_friend t1
     JOIN user_friend t2 ON t1.friendId=t2.userId
     JOIN user_friend t3 ON t2.friendId=t3.userId
     WHERE t3.friendId=$userId AND t1.userId!=$userId
UNION
  SELECT t1.userId FROM user_friend t1
     JOIN user_friend t2 ON t1.friendId=t2.friendId
     JOIN user_friend t3 ON t2.userId=t3.userId
     WHERE t3.friendId=$userId AND t1.userId!=$userId;

此外,这包括朋友的朋友,而不是朋友的朋友。