我有一个名为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有关系。
答案 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 TABLE
和INSERT INTO
,我们都可以玩。