Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 获取我有共同朋友的用户_Mysql_Sql - Fatal编程技术网

Mysql 获取我有共同朋友的用户

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

有两个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 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语句是很低的,但是我猜没有其他方法。非常感谢你们的帮助!非常感谢你!这是最好的陈述。