Mysql 获取我有共同朋友的用户
有两个sql表: 1) 具有以下结构和数据的“用户”: 用户id、用户名称Mysql 获取我有共同朋友的用户,mysql,sql,Mysql,Sql,有两个sql表: 1) 具有以下结构和数据的“用户”: 用户id、用户名称 1, John 2, Mike 3, Chris 4, Paul 5, Kelly 6, Kevin 2) 包含友谊关系的“用户朋友”,具有以下结构和数据: userfriends\u user\u id,userfriends\u friends\u id 1, 2 => [ John is friend with Mike ] 2, 3 => [ Mike is friend with
1, John
2, Mike
3, Chris
4, Paul
5, Kelly
6, Kevin
2) 包含友谊关系的“用户朋友”,具有以下结构和数据:
userfriends\u user\u id,userfriends\u friends\u id
1, 2 => [ John is friend with Mike ]
2, 3 => [ Mike is friend with Chris]
2, 4 => [ Mike is friend with Paul ]
5, 1 => [ Kelly is friend with John]
6, 5 => [ Kevin is friend with Kelly]
我想做一个选择(用户名,用户名)来获取John有共同朋友的那些用户,所以输出应该是Chris,Paul,Kevin。这只能用一个select语句来完成吗?好吧,我还是不知道我现在的想法是否太复杂了。以下是我的想法:
select * from users
where user_id in
(
select user1_id
from
( -- users except John and their friends (again except John)
select userfriends_user_id as user1_id, userfriends_friend_id as user2_id
from userfriends where userfriends_user_id != 1 and userfriends_friend_id != 1
union
select userfriends_friend_id as user1_id, userfriends_user_id as user2_id
from userfriends where userfriends_user_id != 1 and userfriends_friend_id != 1
) others
where user2_id in
( -- friends of John's
select userfriends_user_id from userfriends where userfriends_friend_id = 1
union
select userfriends_friend_id from userfriends where userfriends_user_id = 1
)
);
下面是SQL FIDLE:。您可以通过获取朋友的所有朋友来实现这一点。这需要将
userfriends
表连接回自身
然后,只需看看“朋友的朋友”的出现不止一次。您可以使用分组方式
和拥有
:
select uff.userfriends_friend_id
from userfriends uf join
userfriends uff
on uf.userfriends_friend_id = uff.userfriends_user_id
where uf.userfriends_user_id = 1
group by uff.userfriends_friend_id
having count(*) > 1;
测试此查询:
SELECT * FROM users
WHERE user_id IN
(
SELECT uf.userfriends_friend_id AS CommonId
FROM userfriends uf,
(
SELECT uf2.userfriends_friend_id
FROM userfriends uf2
WHERE uf2.userfriends_user_id = 1
) A
WHERE uf.userfriends_user_id = A.userfriends_friend_id
UNION
SELECT uf.userfriends_user_id AS CommonId
FROM userfriends uf,
(
SELECT uf2.userfriends_user_id
FROM userfriends uf2
WHERE uf2.userfriends_friend_id = 1
) A
WHERE uf.userfriends_friend_id = A.userfriends_user_id
)
我测试了@Thorsten Kettner提供的SQLfiddle。它起作用了。输出是正确的。谢谢@Thorsten Kettner 请澄清你所说的“普通朋友”是什么意思。通常,如果你想要共同的朋友,那么你可以选择任意两个用户,然后选择他们的朋友联盟。你的问题不清楚“John在哪里有共同的朋友”。克里斯和保罗是迈克的朋友,但凯文和他们都不是朋友。。。你能解释一下你是如何决定预期产出的吗?好的,首先对不起我的英语。在这个例子中,约翰有两个朋友迈克和凯利。我想输出与我的朋友(Mike和Kelly)是朋友的用户。约翰和克里斯有共同的朋友=>迈克,约翰和保罗有共同的朋友迈克,约翰和凯文有共同的朋友=>凯利。输出应该是克里斯、保罗和凯文。太好了!这是迄今为止最好的例子,但是对于超过2500个用户来说,这个select语句是很低的,但是我猜没有其他方法。非常感谢你们的帮助!非常感谢你!这是最好的陈述。