【问题标题】:SQL Join's from 3 Table based on two columns基于两列的 3 个表的 SQL 连接
【发布时间】:2014-07-26 19:46:54
【问题描述】:

我有以下 3 个表:Users, Friendship & Location

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

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

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

任何帮助将不胜感激。

【问题讨论】:

标签: sql sql-server join inner-join


【解决方案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

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

【讨论】:

  • 非常感谢布赖恩的快速回复。不幸的是,我已经走了那么远,这对我不起作用。如果我在上面的查询中输入 userid=1,那就完美了。如果我输入 userid=2,则不会返回任何内容。
  • @Mr.Mubi 我相信我已经修好了,请看新的小提琴和sql。
  • @Brain 再次感谢,我已经尝试过了。对于 userid=1 和 2,它将给出相同的结果。所以基本上第一个查询对于 userid=1 和第二个查询对于 userid=2 工作正常。我需要对两者都适用的查询。或者可能存在限制,需要更改 db 的结构。但我想知道是否有解决方案如何将好友列表保存在数据库中。我觉得用 2 条记录作为一种友谊是不合适的。好像用户 jim 向 jay 发送请求并且两者都是朋友一样,它应该保存在一条记录中吗?有什么想法吗?
  • 你试过我的新查询了吗?它对两者都有效(请参阅我上述内容中两个小提琴之间的区别)
【解决方案2】:

如果您一次只提取一个 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);

【讨论】:

    猜你喜欢
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2020-07-15
    • 1970-01-01
    相关资源
    最近更新 更多