描述 :
我有一个用户表如下
学生
id ------ name
1 ------ John
2 ------ Sarah
3 ------ Peter
和朋友表作为
朋友
person1 ------ person2
1 ------ 2
2 ------ 3
现在我想要 2 的所有朋友和所有其他朋友,他们的朋友不是我的朋友。
例如,在"你可能认识的人"中,我们看到的人是我们朋友的朋友,但不是我们的朋友
我已经成功编写了查询以查找我所有的朋友,但我不确定如何在一个查询中找到"我朋友的朋友"
有没有办法在一个查询中做到这一点....
我正在寻找这样的朋友
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是朋友表,$regno
是用户的 ID
也许是这个?我只用你的示例数据测试了它。
select name from students where id in (
select p2 from buddies where p1 in (
select p2 from buddies where p1=[serach_for_id]));
加入两次以获得朋友的朋友:
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 子句适用于第一个命名表,联接表从该表流出,从而提供最大性能。
试试这个
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 个相同朋友。
如果它适合您,我会以不同的格式重写它以使其更好
我想这对你有用。
首先,我在两个第一个查询中选择您的朋友。
然后我查询好友表(或本例中的好友),他们是你朋友
的朋友它涵盖了所有情况:
/*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)