2015-02-24 185 views
0

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

我的问题是:

  1. 是查询是否正确?

  2. 我如何使用连接执行此查询?

这是我朋友表

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

注意,DISTINCT不是一个函数 – Strawberry 2015-02-24 09:43:22

+2

而在这些子querys是DISTINCT没有什么区别可言最终结果。 – jarlh 2015-02-24 09:45:31

回答

1

这似乎是连贯的。

你错过的唯一的事情是,你不应该返回$用户id可以是其朋友的朋友的朋友

编辑:我不知道,如果你的数据库已经包含在这两种方式的友谊。所以你也必须考虑如果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; 

喜欢玩同样,这包括朋友的朋友的朋友,但不是朋友的朋友。

+0

这是一个很好的观点,我想像那里可能有各种各样的循环,就像你是朋友的朋友,而你的朋友是朋友的朋友的朋友,这取决于我认为表格的结构。 – colmde 2015-02-24 09:53:07

+0

如果你想包括(或不是)那些只是朋友的朋友的人,可能必须考虑。 – Rubik 2015-02-24 10:06:02

+0

此查询大约需要2分钟。我的嵌套查询花费了大约12秒。我有500000个测试数据。这是正常的吗? – emre 2015-02-24 11:26:04

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 
+0

此查询大约需要2分钟。我的嵌套查询花费了大约12秒。我有500000个测试数据。这是正常的吗? – emre 2015-02-24 11:24:35

+0

我认为查询时间结果在phpmyadmin上是错误的。它说“查询花了2.4342秒”,但记录显示需要2分钟。我可能会尝试终端。我认为加入速度要快得多。 – emre 2015-02-24 11:32:38

+0

我很惊讶JOIN查询花费的时间比嵌套查询长......我有兴趣知道在终端上执行它的结果......(在'userId'上有一个索引,对不对?) – colmde 2015-02-24 14:09:57