寻找共同的朋友 sql
Finding mutual friend sql
实际上我有 2 table 朋友 table 和用户 table
我试图实现的是通过检查另一个用户的朋友来检索我的共同朋友,并从用户那里获取这些共同朋友的数据table
table朋友是这样的身材
id | user1 | user2 | friend_status
然后 table 数据看起来像这样
1 | 1 | 2 | 1
2 | 1 | 3 | 1
3 | 2 | 3 | 1
4 | 1 | 4 | 1
5 | 2 | 4 | 1
然后假设我是 id 为 2 的用户,那么在那个 table 我有 3 个朋友 - 1、3 和 4。我要检索的是与用户 1 的普通朋友还有 3 个朋友 - 2、3 和 4,并从 table 用户检索 2 个共同朋友 3 和 4
的数据
您需要这样的东西吗?
create table #table (id int, user1 int , user2 int, friend_status int)
insert into #table values
(1 , 1 , 2 , 1),
(2 , 1 , 3 , 1),
(3 , 2 , 3 , 1),
(4 , 1 , 4 , 1),
(5 , 2 , 4 , 1),
(6 , 2 , 1 , 1),
(7, 3 , 7 , 1)
select *from #table
select t1.user1, t1.user2 as friend
from #table t1
inner join
#table t2
on (t1.user2 = t2.user2
and t1.user1 <> t2.user1)
where t1.user1<>2
order by t1.user1
这是一种使用 union all
合并用户 1 和用户 2 的所有朋友并使用 count(distinct src) > 1
仅 select 与这两个用户都是朋友的方法。
select friend from (
select 2 src, user1 friend from friends where user2 = 2
union all select 2, user2 from friends where user1 = 2
union all select 1, user1 from friends where user2 = 1
union all select 1, user2 from friends where user1 = 1
) t group by friend
having count(distinct src) > 1
您可以使用 UNION
来获取用户好友:
SELECT User2 UserId FROM friends WHERE User1 = 1
UNION
SELECT User1 UserId FROM friends WHERE User2 = 1
然后,在 UserId
上为两个不同的用户加入其中两个 UNION
,您可以获得共同的朋友:
SELECT UserAFriends.UserId FROM
(
SELECT User2 UserId FROM friends WHERE User1 = 1
UNION
SELECT User1 UserId FROM friends WHERE User2 = 1
) AS UserAFriends
JOIN
(
SELECT User2 UserId FROM friends WHERE User1 = 2
UNION
SELECT User1 UserId FROM friends WHERE User2 = 2
) AS UserBFriends
ON UserAFriends.UserId = UserBFriends.UserId
实际上我有 2 table 朋友 table 和用户 table 我试图实现的是通过检查另一个用户的朋友来检索我的共同朋友,并从用户那里获取这些共同朋友的数据table
table朋友是这样的身材
id | user1 | user2 | friend_status
然后 table 数据看起来像这样
1 | 1 | 2 | 1
2 | 1 | 3 | 1
3 | 2 | 3 | 1
4 | 1 | 4 | 1
5 | 2 | 4 | 1
然后假设我是 id 为 2 的用户,那么在那个 table 我有 3 个朋友 - 1、3 和 4。我要检索的是与用户 1 的普通朋友还有 3 个朋友 - 2、3 和 4,并从 table 用户检索 2 个共同朋友 3 和 4
的数据您需要这样的东西吗?
create table #table (id int, user1 int , user2 int, friend_status int)
insert into #table values
(1 , 1 , 2 , 1),
(2 , 1 , 3 , 1),
(3 , 2 , 3 , 1),
(4 , 1 , 4 , 1),
(5 , 2 , 4 , 1),
(6 , 2 , 1 , 1),
(7, 3 , 7 , 1)
select *from #table
select t1.user1, t1.user2 as friend
from #table t1
inner join
#table t2
on (t1.user2 = t2.user2
and t1.user1 <> t2.user1)
where t1.user1<>2
order by t1.user1
这是一种使用 union all
合并用户 1 和用户 2 的所有朋友并使用 count(distinct src) > 1
仅 select 与这两个用户都是朋友的方法。
select friend from (
select 2 src, user1 friend from friends where user2 = 2
union all select 2, user2 from friends where user1 = 2
union all select 1, user1 from friends where user2 = 1
union all select 1, user2 from friends where user1 = 1
) t group by friend
having count(distinct src) > 1
您可以使用 UNION
来获取用户好友:
SELECT User2 UserId FROM friends WHERE User1 = 1
UNION
SELECT User1 UserId FROM friends WHERE User2 = 1
然后,在 UserId
上为两个不同的用户加入其中两个 UNION
,您可以获得共同的朋友:
SELECT UserAFriends.UserId FROM
(
SELECT User2 UserId FROM friends WHERE User1 = 1
UNION
SELECT User1 UserId FROM friends WHERE User2 = 1
) AS UserAFriends
JOIN
(
SELECT User2 UserId FROM friends WHERE User1 = 2
UNION
SELECT User1 UserId FROM friends WHERE User2 = 2
) AS UserBFriends
ON UserAFriends.UserId = UserBFriends.UserId