2012-03-05 119 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的表格:仅仅因为你在关注我的活动并不意味着我想跟随你的表达。