在PostgreSQL中使用子查询确定行之间的关系

在PostgreSQL中使用子查询确定行之间的关系,sql,postgresql,Sql,Postgresql,我试图找出如何在单个查询中完成以下任务。 基本上,给定一个用户的ID,我想返回他所有朋友的用户配置文件。 如果有什么不清楚的地方,我很乐意详细介绍。谢谢 表格“用户”: user_id | col1 | col2 | etc ----------------------------------------- a | *** | *** | *** ----------------------------------------- b

我试图找出如何在单个查询中完成以下任务。 基本上,给定一个用户的ID,我想返回他所有朋友的用户配置文件。 如果有什么不清楚的地方,我很乐意详细介绍。谢谢

表格“用户”:

 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