从联盟分组SQL结果

时间:2011-05-17 02:46:27

标签: sql group-by union

嘿伙计们 - 我的数据库中有一张表供用户互相关注。

表格如下: 唯一身份 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侧唯一结果的数据集不感兴趣 - 查询应仅返回不同的值。

2 个答案:

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

现在您也知道了连接的方向。