0
UserRelations{UserID, FriendID, RelationStatus}

还有 ID 为 1、2、3 等的用户。用户 1 向用户 2 发送请求 用户 3 向用户 1 发送请求 所以在数据库中我有:

1 | 2 | 1

3 | 1 | 1

现在我写查询有点困惑(也许设计是错误的)。
我需要根据用户 ID 获取所有朋友的列表。但是,如果用户请求关系或有人向他请求关系,则用户可以基于此在两列中。
如果我使用这个查询,我会得到所有向我请求关系的用户,但我会得到一个我已经发送了关系请求的用户列表,但我得到的个人资料数据是我的,而不是来自那个用户。

select ur.*, p.FirstName, p.LastName
from userRelations ur
join Profiles p on ur.UserId = p.UserId
where ur.FriendId = @UserId or
ur.UserId = @UserId
4

2 回答 2

2

我认为您只是缺少对以下个人资料的加入FriendId

select ur.*, p1.FirstName, p1.LastName, p2.FirstName, p2.LastName
from userRelations ur
join Profiles p1 on ur.UserId = p1.UserId
join Profiles p2 on ur.FriendId = p2.UserId
where ur.FriendId = @UserId or ur.UserId = @UserId
于 2012-04-21T16:53:47.660 回答
1

您需要使用UNION查询来让朋友双向前进,而不是在 WHERE 子句中使用 OR 运算符,如下所示:

select               -- Get people you friended.
  ur.UserID          -- ME (i.e. the @User)
, ur.FriendID        -- The other person.
, ur.RelationStatus
, p.FirstName
, p.LastName 
from userRelations ur                    
inner join Profiles p on ur.FriendId = p.UserId
where ur.UserId = @UserId
--
union all
--
select               -- Get people who friended you.
  ur.FriendID        -- ME (i.e. the @User)
, ur.UserID          -- The other person.
, ur.RelationStatus
, p.FirstName
, p.LastName 
from userRelations ur                    
inner join Profiles p on ur.UserId = p.UserId
where ur.FriendId = @UserId 

请注意每个 select、join 和每个 where 子句中的列如何变化以反映 UNION 每一半的友谊方向的观点。

于 2012-04-21T19:34:43.480 回答