2012-03-05 87 views
0

我有一個錶鏈接userID和friendID(這是另一個用戶)說他們是朋友。 如果用戶1的用戶24作爲他們的朋友,下表中的第一行會發生 如果用戶10將用戶1作爲他們的朋友,下表中的第二行會發生MySQL表加入

從那裏,即使用戶1在任何一方,他們是與相鄰ID的朋友。

FRIENDS TABLE: 

userID | friendID 
----------------- 
    1 | 24 
    10 | 1 

我現在需要做的是:如果用戶1登錄,我需要顯示他們的朋友。該查詢我已經寫了:

SELECT DISTINCT (Users.username), friends.userID, friends.friendID FROM Users, friends WHERE Users.userID IN(SELECT userID FROM friends WHERE Users.userID = friends.userID) OR Users.userID IN(SELECT DISTINCT(userID) FROM friends WHERE Users.userID = friends.friendID) 

將帶回:

username | userID | friendID 
----------------------------- 
    name1 | 10 | 1 
    name1 | 1 | 24 
    name2 | 10 | 1 
    name2 | 1 | 24 

名1 = ID 1 名稱2 = ID 10

有沒有一種方法,我可以取回已登錄的用戶朋友(例如,如果ID#1已登錄)是否出現在用戶ID或friendID列中。然後,在這種情況下,檢索ID 24和10,因爲它們與ID#1鏈接,然後當顯示時,從列表中消除ID#1,因爲它會引起他們與自己的朋友。

希望這是有道理的,並提前感謝您!

回答

1

下面是一個簡單的方法來做到這一點UNION。這也需要照顧重複的:

(SELECT userID 
FROM friends 
WHERE friendID = 1) 
UNION 
(SELECT friendID 
FROM friends 
WHERE userID = 1) 

如果您想返回用戶名太,你可以做你的子查詢內部聯接:

(SELECT f.userID, u.username 
FROM friends f 
JOIN users u 
    ON u.userID = f.userID 
WHERE f.friendID = 1) 
UNION 
(SELECT f.friendID, u.username 
FROM friends f 
JOIN users u 
    ON u.userID = f.friendID 
WHERE f.userID = 1) 
+0

您仍然可能想要將其包裝在SELECT DISTINCT中你不會得到重複。 – Brad 2012-03-05 21:04:29

+0

@Brad,感謝您的評論,但UNION會自動刪除重複的行。 – 2012-03-05 21:09:30

+0

哦,我從來沒有意識到!感謝信息 – Brad 2012-03-05 21:11:38

2
SELECT DISTINCT s.FriendId 
FROM (
    SELECT f.FriendId 
    FROM Friends f 
    WHERE f.UserId = @id 
    UNION ALL 
    SELECT f.UserId 
    FROM Friends f 
    WHERE f.FriendId = @id 
) s 
WHERE s.FriendId != @id 

您可能不需要最後的WHERE,因爲用戶可能不會將自己添加爲朋友。

+0

大概你可以這樣做: 'SELECT DISTINCT s.FriendId,u.Username FROM(SELECT f.FriendId 朋友˚F WHERE f.UserId = @id UNION ALL SELECT f.UserId FROM Friends f WHERE f.FriendId = @id )s JOIN用戶名u ON u.Id = s.FriendId WHERE s.FriendId!= @ id' – Daan 2012-03-05 23:08:27

2

當你存儲數據的方式可能看起來效率高,以下可能是更好的方法: 當一個MUTUAL友誼形成時,輸入數據兩次:一次作爲userID(1)friendID(24),一次作爲userID(24)friendID(1)。這種方法可能很好的原因是它使你的表可重用。現在你的桌子就像Facebook一樣:如果我是你的朋友,那麼你也是我的朋友:我看到你的活動;你看到我的活動。我解釋的設計允許你使用facebook和twitter的表格:僅僅因爲你在關注我的活動並不意味着我想跟隨你的表達。