2015-02-24 162 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