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