2010-05-10 129 views
8

我的MySQL表结构是这样的。SQL获取朋友和朋友的朋友

USER 
int id 
varchar username 

FRIEND_LIST 
int user_id 
int friend_id 

对于每个朋友关系,我在FRIEND_LIST中插入2条记录。 如果用户1为用户2的朋友那么接下来的行插入FRIEND_LIST

1,2 
2,1 

我想要得到的特定用户的朋友的朋友的朋友。

select应该返回列a,b,c。

a: user_id 
b: friend_id 
c: username (username of friend_id) 

If 1 is friend of 2 and 3. 
2 is friend of 3, 4 and 5 
3 is friend of 5,6,7 

然后查询得到1的朋友的朋友的朋友应该返回:

1 2 two 
1 3 three 
2 1 one 
2 3 three 
2 4 four 
2 5 five 
3 1 one 
3 5 five 
3 6 six 
3 7 seven 

我能得到这个行与单个查询?

UPDATE ANSWER:我修改了DVK的答案,这是返回我正在寻找的查询。

SELECT friends.user_id, friends.friend_id, username 

FROM 
     FRIEND_LIST friends, USER 

WHERE 
     CAT_USER.id = friends.friend_id 
AND 
     friends.user_id = 1 

UNION 

SELECT 
     fof.user_id, fof.friend_id, username 
FROM 
     FRIEND_LIST friends, FRIEND_LIST fof, USER 
WHERE 
     USER.id = fof.friend_id 
AND 
     friends.friend_id = fof.user_id 
AND 
     friends.user_id = 1; 

回答

1

这是低效率的,但阅读:

SELECT friends.user_id, friends.friend_id, username 
FROM FRIEND_LIST friends, USER 
WHERE USER.id   = friends.friend_id 
AND USER.id = 1 
UNION 

SELECT USER.user_id, fof.friend_id, username 
FROM FRIEND_LIST friends, FRIEND_LIST fof, USER 
WHERE USER.id   = fof.friend_id 
AND friends.friend_id = fof.user_id 
AND USER.id = 1 

OR

SELECT user_id, f_fof.friend_id, username 
FROM USER, (
    SELECT f.user_id, f.friend_id 
    FROM FRIEND_LIST f 
    WHERE user_id = 1 
    UNION 
    SELECT f.user_id, fof.friend_id 
    FROM FRIEND_LIST f, FRIEND_LIST fof 
    WHERE user_id = 1 
    AND f.friend_id = fof.user_id 
) as f_fof 
WHERE USER.id   = f_fof.friend_id 
+0

我尝试的第一个查询,但它说,user_id是暧昧 – Enrique 2010-05-10 22:54:06

+0

我将使用第一查询,第二个给了我错误的结果。 非常感谢! – Enrique 2010-05-10 23:54:48

2
SELECT f1.user_id, f1.friend_id FROM 
friends_info f1 
WHERE f1.user_id = 1 OR 
f1.user_id IN 
(
select f2.friend_id 
from friends_info f2 
where f2.user_id = 1 
) 
ORDER BY user_id 
+0

你好,我试过查询,但它也返回朋友的朋友的朋友。在上面的例子中,它也返回4,5,6,7 – Enrique 2010-05-10 23:03:53

+0

的朋友,我的坏...我试图避免工会,但这似乎并没有工作... – a1ex07 2010-05-10 23:31:03

+0

它似乎工作现在... – a1ex07 2010-05-10 23:38:48