2013-03-07 35 views
1

我想弄清楚如何在單個查詢中完成以下任務。 基本上,給定一個用戶的ID,我想返回他是他的朋友的所有用戶的用戶配置文件。 如果有什麼不清楚的地方,我會很樂意詳細介紹。謝謝!確定PostgreSQL中使用子查詢的行之間的關係

表 '用戶':

user_id | col1 | col2 | etc 
----------------------------------------- 
a  | *** | ***  | *** 
----------------------------------------- 
b  | *** | ***  | *** 

表 'users_friends'

user_id | friend_user_id | status 
----------------------------------------- 
a  | b    | 1 
----------------------------------------- 
b  | a    | 1 

給出的一個的值,在表中找到行users_friends其中

user_id = a 
status = 1 

使用所產生的該查詢的行,發現排在表users_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); 

回答

0

假設有在朋友表中沒有重複:

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' 
1
select u.* 
from 
    users u 
    inner join 
    users_friends f on u.user_id = f.friend_user_id 
where 
    f.status = 1 
    and f.friend_user_id = 'a' 
0

SQL Fiddle

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