嘿伙计们 - 我的数据库中有一张表供用户互相关注。
表格如下: 唯一身份 FollowerID FollowedUserID
FollowID是关注其他人的用户ID
FollowedUserID是FollowID用户
所关注的人的用户ID我想根据一个用户检索此表中的连接列表。我的查询应返回当前用户跟随或后跟而没有重叠的所有其他UserID。
所以说我们在这里有几个条目:
FollowerID FollowedUserID
1 2
1 3
4 1
2 1
这表明用户 1 跟随用户2和3,因此用户2和3正在跟随用户 1 。另一方面,它显示用户 1 后面跟着用户2和3.
我想要做的是找出用户 1 的连接,因此查询应返回用户:2,3和4(用户 1 正在跟随用户2和3,并且正在跟随用户4)
如何从单个查询中实现此目的?
连接被视为被跟踪或跟随其他人,因此可能会发生一些重复的结果(如果两个用户都在跟随彼此)。我希望能够将这些结果分组,以便结果明确。
我尝试了类似于:
的UNION查询SELECT FollowerID, FollowedUserID From Follows WHERE FollowerID = 1
UNION
SELECT FollowerID, FollowedUserID FROM Follows WHERE FollowedUserID = 1
从理论上讲,我希望将FollowerID和FollowedUserID组合在一起以保持它们的不同。
我对检索非独特结果然后创建php侧唯一结果的数据集不感兴趣 - 查询应仅返回不同的值。
答案 0 :(得分:8)
你很接近,但是你必须颠倒UNION的一个分支中列的顺序:
SELECT FollowerID AS reference_user, FollowedUserID AS connection
FROM Follows
WHERE FollowerID = 1
UNION
SELECT FollowedUserID AS reference_user, FollowerID AS connection
FROM Follows
WHERE FollowedUserID = 1
GROUP BY reference_user;
请注意,如果删除WHERE子句,则会获得所有人的所有连接。
答案 1 :(得分:2)
我认为你需要修改你的查询:
edit: removed the un-needed select distinct
SELECT FollowedUserID as ID From Follows WHERE FollowerID = 1
UNION
SELECT FollowerID as ID FROM Follows WHERE FollowedUserID = 1
但这并没有完全回答方向问题。
SELECT FollowedUserID as ID, "follow" as direction
From Follows
WHERE FollowerID = 1
UNION
SELECT FollowerID as ID, "followed" as direction
FROM Follows
WHERE FollowedUserID = 1
现在您也知道了连接的方向。