在PostgreSQL中使用子查询确定行之间的关系
我试图找出如何在单个查询中完成以下任务。 基本上,给定一个用户的ID,我想返回他所有朋友的用户配置文件。 如果有什么不清楚的地方,我很乐意详细介绍。谢谢 表格“用户”:在PostgreSQL中使用子查询确定行之间的关系,sql,postgresql,Sql,Postgresql,我试图找出如何在单个查询中完成以下任务。 基本上,给定一个用户的ID,我想返回他所有朋友的用户配置文件。 如果有什么不清楚的地方,我很乐意详细介绍。谢谢 表格“用户”: user_id | col1 | col2 | etc ----------------------------------------- a | *** | *** | *** ----------------------------------------- b
user_id | col1 | col2 | etc
-----------------------------------------
a | *** | *** | ***
-----------------------------------------
b | *** | *** | ***
表格“用户与朋友”
user_id | friend_user_id | status
-----------------------------------------
a | b | 1
-----------------------------------------
b | a | 1
给定值a,在表用户/朋友中查找行,其中
user_id = a
status = 1
使用该查询的结果行,在表users\u friends中查找行,其中
user_id = b (column `user_friend_id` from resulting rows)
user_friend_id = a (column `user_id` from resulting rows)
status = 1
如果返回了任何行,请从“用户”表中选择行,其中
user_id = b (column `user_id` from resulting row)
这是我想出的一个非常粗糙的方法。我想这正是我想要的,但我相信有更好的方法去做
SELECT * FROM users WHERE user_id IN
(SELECT user_id FROM users_friends WHERE friend_user_id IN
(SELECT user_id FROM users_friends WHERE user_id = 'someuserid' AND status = 1 ) AND status = 1 );
假设friends表中没有重复项:
SELECT u.user_id, u.col1, u.col2
JOIN users_friends AS f1 ON u.user_id=f1.user_id
JOIN users_friends AS f2 ON f1.user_id=f2.friend_id AND f1.friend_id=f2.user_id
WHERE f1.status=1 AND f2.status=1 AND f2.user_id='a'
假设friends表中没有重复项:
SELECT u.user_id, u.col1, u.col2
JOIN users_friends AS f1 ON u.user_id=f1.user_id
JOIN users_friends AS f2 ON f1.user_id=f2.friend_id AND f1.friend_id=f2.user_id
WHERE f1.status=1 AND f2.status=1 AND f2.user_id='a'
SELECT u.user_id, u.col1
FROM users_friends AS f
JOIN users AS u
ON f.friend_user_id = u.user_id
WHERE f.user_id = 'a'
AND f.status = 1