如何在mysql中找到朋友的朋友

时间:2014-11-16 16:03:59

标签: mysql sql hierarchical-data recursive-query

说明:

我有一个用户表如下

学生

id ------ name     
1  ------ John    
2  ------ Sarah    
3  ------ Peter

和朋友表一样

伙伴

person1 ------  person2    
1       ------  2
2       ------  3

现在我想要所有朋友和其他朋友的朋友不是我的朋友。

在"你可能知道的人"我们看到的人是我们朋友的朋友,但不是我们的朋友

我已成功编写查询以查找我的所有朋友,但我不知道如何找到朋友的朋友"在一个查询中

有没有办法在一个查询中执行....

我找到这样的朋友

 select * from `students` join `buddy_circle` on 
'$reg_no' = `person_1` and `stregno` = `person_2` or 
'$reg_no' = `person_2` and `stregno` = `person_1`

其中stregno是学生的id,buddy_circle是friends表,$regno是用户的id

4 个答案:

答案 0 :(得分:1)

也许这个? 我仅使用您的示例数据对其进行了测试。

select name from students where id in (
    select p2 from buddies where p1 in (
        select p2 from buddies where p1=[serach_for_id]));

答案 1 :(得分:1)

加入两次以结交朋友的朋友:

select distinct name
from buddy_circle a
join buddy_circle b on b.p1 = a.p2
join students on id = b.p2
where a.p1 = $reg_no

请注意,查询中表的顺序是这样的,where子句适用于第一个命名表,并且连接表从那里流出,这样可以获得最大的性能。

答案 2 :(得分:0)

试试这个

select * from students As s join buddy_circle As b on s.id= b.person_2 or b.person_1 = s.id Where id =2

此查询应该为您提供所有学生的列表,其中包含2位朋友。

如果它对您有用,我将以不同的格式重新编写它以使其更好

答案 3 :(得分:0)

我想这对你有用。
首先,我在两个第一个查询中选择你的朋友 然后我查询好友表(或本例中的朋友)他们是你朋友的朋友 它涵盖了所有情况:

/*select my friends in col2 while I'm in col1 */
SELECT p2 FROM Friends WHERE p1 = @MyID

UNION
/*select my friends in col1 while I'm in col 2 */
SELECT p1 FROM Friends WHERE P2 = @MyID

Union
/*
select my friend's friends which
my firends are in col1 and my firend's friends are in col2
*/
SELECT  p2 FROM Friends
WHERE
    p1 in (SELECT P2 FROM Friends where P1=@MyID)

union
SELECT p1 FROM Friends
WHERE
    p2 in (SELECT P2 FROM Friends where P1=@MyID)

union    
SELECT p1 FROM Friends
WHERE
    p2 in (SELECT P1 FROM Friends where P2=@MyID)

union
SELECT p2 FROM Friends
WHERE
    p1 in (SELECT P1 FROM Friends where P2=@MyID)