MySQL表连接

时间:2012-03-05 20:55:08

标签: php mysql

我有一个表连接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,因为它会显示它们是他们自己的朋友。

希望这是有道理的,并提前感谢你!

3 个答案:

答案 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)