SQL检查一条记录是否有来自另一个表的引用,如果有,请执行某些操作

SQL检查一条记录是否有来自另一个表的引用,如果有,请执行某些操作,sql,postgresql,Sql,Postgresql,我有两张桌子,用户和朋友 还有友谊 现在,每当用户登录到系统时,我需要获取数据库中的所有用户,还需要在select查询的结果中添加一个额外的列,该列显示与当前登录用户的友谊状态 例如,用户id 1、Dave登录到系统和用户请求列表,选择查询应输出如下 id | name | password | friend_status ------------------------------------------ 1 | Dave | 1234

我有两张桌子,用户和朋友

还有友谊

现在,每当用户登录到系统时,我需要获取数据库中的所有用户,还需要在select查询的结果中添加一个额外的列,该列显示与当前登录用户的友谊状态

例如,用户id 1、Dave登录到系统和用户请求列表,选择查询应输出如下

id   |  name   | password  | friend_status            
------------------------------------------
 1    |  Dave   | 1234     |   me
------------------------------------------ 
 2    |  John   | abcd     |   pending
------------------------------------------
 3    |  Bob    | xyz      |   active
------------------------------------------
当用户id 2 John登录到系统时,他需要获得下表

 id   |  name   | password  | friend_status            
------------------------------------------
 1    |  Dave   | 1234     |   pending
------------------------------------------ 
 2    |  John   | abcd     |   me
------------------------------------------
 3    |  Bob    | xyz      |   null
------------------------------------------
这可能吗?我尝试连接表并使用嵌套查询

例如,通过下面的查询,我可以获得当前登录用户的所有友谊

select * from friendships
where friend_one = 2 or friend_two = 2
但我不知道下一步该怎么办。我尝试将其作为主select查询的嵌套查询,并尝试联接表,但没有得到我想要的结果

谁能给我一个主意吗

您需要将users的id值列表与users表交叉连接,以获得所有不同的id值对,然后将其左连接到friendships表以获得每个用户的好友状态:

SELECT u1.id, u.name, u.password,
       f.status
FROM users u
CROSS JOIN (SELECT DISTINCT id
            FROM users) u1
LEFT JOIN friendships f ON f.friend_one = u.id  AND f.friend_two = u1.id
                        OR f.friend_one = u1.id AND f.friend_two = u.id
ORDER BY u1.id, u.id
输出:

id  name    password    status
1   Dave    1234        me
1   John    abcd        pending
1   Bob     xyz         active
2   Dave    1234        pending
2   John    abcd        me
2   Bob     xyz         (null)
3   Dave    1234        active
3   John    abcd        (null)
3   Bob     xyz         me

要获取特定用户,只需添加WHERE u1.id=?在ORDER BY条款之前。

@Dilshan别担心,我很高兴能帮上忙。
SELECT u1.id, u.name, u.password,
       f.status
FROM users u
CROSS JOIN (SELECT DISTINCT id
            FROM users) u1
LEFT JOIN friendships f ON f.friend_one = u.id  AND f.friend_two = u1.id
                        OR f.friend_one = u1.id AND f.friend_two = u.id
ORDER BY u1.id, u.id
id  name    password    status
1   Dave    1234        me
1   John    abcd        pending
1   Bob     xyz         active
2   Dave    1234        pending
2   John    abcd        me
2   Bob     xyz         (null)
3   Dave    1234        active
3   John    abcd        (null)
3   Bob     xyz         me