2011-05-17 87 views
3

嘿家伙 - 我在我的数据库中有一个表用于用户跟随彼此。从一个联盟分组SQL结果

表去如下: 的UniqueID FollowerID FollowedUserID

FollowID是谁是下别人

FollowedUserID是谁是被随后FollowID的人的用户名的人的用户名用户

我想根据单个用户检索此表中的连接列表。我的查询应该返回当前用户为的所有其他用户标识,它们跟随或跟在之间,没有重叠。

所以说,我们这里有几个项目:

FollowerID FollowedUserID 
    1    2 
    1    3 
    4    1 
    2    1 

这表明用户跟随用户2和3,得到用户2和3的后面是用户 。在光谱的另一端它表明用户其次是用户2和3

我希望做的是找出用户有连接,所以查询应该返回用户:2,3和4(用户跟随用户2和3,并且正在跟随用户4)

如何从单个查询中实现此目的?

A 连接被认为是被跟随或跟随其他人,因此可能会发生一些重复的结果(如果两个用户都相互依赖)。我希望能够将这些结果分组,以便结果不同。

我已经试过类似UNION查询:

SELECT FollowerID, FollowedUserID From Follows WHERE FollowerID = 1 
UNION 
SELECT FollowerID, FollowedUserID FROM Follows WHERE FollowedUserID = 1 

理论上我想集团FollowerID和FollowedUserID在一起,让他们截然不同。

我不想检索一个非独特的结果,然后创建一个独特的PHP结果数据集 - 查询应该只返回不同的值。

+0

这是什么RDBMS?这是MS SQL Server吗? – 2011-05-17 02:53:35

+0

我不太明白你的问题是什么。您发布的UNION查询出了什么问题? “Group FollowerID和FollowedUserID一起使它们保持不同”是什么意思?那没有意义。也许你可以添加你想得到的结果,也许我们可以找到一个查询来产生它。 – sleske 2011-05-17 02:55:20

+0

而顺便说一句,'SELECT ... UNION SELECT ...'将自动仅检索不同的值。如果你想复制,你必须使用'UNION ALL'。 – sleske 2011-05-17 02:56:49

回答

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子句,你会得到大家的所有连接。

+0

谢谢@Jon - 小组将整个工会分组?感谢您的提示,我确实意识到,如果确实需要查看所有连接,我会这样做 – Atticus 2011-05-17 02:58:55

+1

@Atticus:是的,GROUP BY适用于整个查询。 – 2011-05-17 03:02:24

+0

感谢,+1并回答。 – Atticus 2011-05-17 03:03:36

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 

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

+0

既然你写了UNION而不是UNION ALL,外面的DISTINCT是多余的 - UNION自动消除重复。 – 2011-05-17 02:56:01

+0

DISTINCT部分是多余的;无论如何,UNION只返回不同的值。 – sleske 2011-05-17 02:58:02

+0

我知道。忘了。虽然我不确定我是否回答了这个问题。它看起来像操作员想要1个查询来回答两个不同的问题,我不积极我(或你)保留足够的信息来知道连接的方式。然后再次,我认为没有布尔标记方向是不可能的。嗯,这是一个想法。 – 2011-05-17 02:58:50