SQL基于两列从3表中加入

时间:2014-07-26 19:46:55

标签: sql sql-server join inner-join

我有以下3个表:UsersFriendship& Location

我需要编写查询,根据用户ID从所有3个表中提取数据。

enter image description here

enter image description here

我认为这里的技巧是你必须根据友谊表中的两列来提取数据,即userid和friendid(所以两者都是朋友)并根据你需要的用户朋友列表,你需要拉他的朋友的名字,相应的电子邮件和位置。

我已经使用连接编写了一些查询,但无法获得我上面提到的所需内容。

任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:1)

select f.id as friendshipid,
       f.userid,
       f.friendid,
       u.name,
       u.email,
       l.location
  from (select id, userid, friendid
          from friendship
        union all
        select id, friendid, userid
          from friendship) f
  left join location l
    on f.friendid = l.userid
  left join users u
    on f.friendid = u.id
 where f.userid = 2

你可以在这里看到一个小提琴测试:http://sqlfiddle.com/#!6/8eba4/13/0

我使用内联视图来反转友谊表并使用联合连接回表本身,这样查询就可以看到两个方向的友谊,因为它们只存储在一个方向上。

答案 1 :(得分:0)

如果您一次只提取一个ID,则无需执行子查询即可执行此操作。

SELECT friendship.id FriendshipID
, @SearchedID UserID
, users.id FriendID
, users.name Name
, users.email Email
, location.location Location
FROM friendship
INNER JOIN users
  ON friendship.userid = users.id 
  OR friendship.friendid = users.id
INNER JOIN location
  ON users.id = location.userid
WHERE 
  users.id <> @SearchedID
  AND (friendship.userid = @SearchedID OR friendship.friendid = @SearchedID);