我如何获得用户之间的关系?

时间:2016-02-25 18:05:48

标签: mysql sql

我有一个名为users的表,例如:

表:用户

username id 
Simon     6
Ida       7

和关系表

Table: Relationships

me partner
 6       7

现在,对于创建的每个关系,我和合作伙伴列将根据发送请求的用户之一获取ID。

如果Ida向Simon发送请求,则该列如下所示:me:7 partner:6 因为Ida是id号7而Simon是6号。

但是如果Simon发送请求,那么列看起来像这样:me:6 partner:7

我想要做的是编写一个查询,从关系表中为每个有关系的用户获取正确的id,然后使用id加入users表并获取合作伙伴用户名并将其打印出来。

我的问题是Me和Partner列可以有不同的值,具体取决于首先发出请求的2个用户中的哪一个。

如何编写一个查询,为每个用户打印出正确的信息,并为他们提供合作伙伴的正确ID?

输出应该如何:

  • 从simons的角度来看* :你和Ida有关系。

  • 从Idas的角度来看* :你和Simon有关系。

3 个答案:

答案 0 :(得分:0)

如果您希望获得与您指定的某个用户(例如:id:2)有关系的所有用户,我会使用以下内容:

SELECT id, username
FROM user, 
    (SELECT receiver_id as rel_id FROM relationship WHERE sender_id=2 union
     SELECT sender_id as rel_id FROM relationship WHERE receiver_id=2) tab
WHERE id=rel_id

内部声明意味着您正在选择所有关系,其中2是发送者,2是接收者的所有关系,并将它们堆叠在同一列(联合)中。

之后,表用户用于从id获取用户名。

答案 1 :(得分:0)

Select username as username, 
    (select username name from users uSubq where uSubq.id = r.partner) as partnername 
    from users u join relationships r on u.id=r.me 
UNION
Select username as username, 
    (select username name from users uSubq where uSubq.id = r.me) as partnername 
    from users u join relationships r on u.id=r.partner;

以下是查询的测试:Sql Fiddle

如果Ida向Simon发送请求或反向发送请求但不是两者,请使用UNION ALL以获得更好的性能。

答案 2 :(得分:0)

我想提供另一种选择。

将用户表加入me列或partner列的关系表。

然后使用相同的标准将用户表连接回关系表。

SELECT u.username, 
FROM users u
JOIN relationships r ON u.id = r.me OR u.id = r.partner
JOIN users u2 ON r.me = u2.id OR r.partner = u2.id
WHERE u.id = 'THE USER YOU CARE ABOUT'

未测试。如果你抛出一些CREATE TABLEINSERT INTO,我们都可以玩。