我有一个表连接userID和friendID(这是另一个用户),表示他们是朋友。 如果用户1将用户24添加为他们的朋友,则下表中的第一行将会发生 如果用户10将用户1添加为他们的朋友,则下表中的第二行将发生
从那里开始,即使用户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
name1 = ID 1 name2 = ID 10
有没有办法可以检索登录用户的朋友(例如,如果登录了ID#1),他们是否出现在userID或friendID列中。然后,在这种情况下,检索ID 24和10,因为它们与ID#1链接,然后在显示时,从列表中删除ID#1,因为它会显示它们是他们自己的朋友。
希望这是有道理的,并提前感谢你!
答案 0 :(得分: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,因为用户可能没有将自己添加为朋友。
答案 1 :(得分:2)
虽然您存储数据的方式似乎有效,但以下可能是更好的方法: 当形成MUTUAL友谊时,输入两次数据:一次作为userID(1)friendID(24),一次作为userID(24)friendID(1)。这种方法可能是好的原因是它使您的表可重用。
现在你的桌子就像是facebook:如果我是你的朋友,那么你也是我的朋友:我看到你的活动;你看我的活动了。我解释的设计允许你将表用作facebook和twitter:仅仅因为你关注我的活动并不意味着我想跟随你的。
答案 2 :(得分:1)
这是使用UNION
执行此操作的简便方法。这也需要重复:
(SELECT userID
FROM friends
WHERE friendID = 1)
UNION
(SELECT friendID
FROM friends
WHERE userID = 1)
如果您也想返回用户名,可以在子查询中执行JOIN:
(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)