互助的朋友sql(Mysql)

Fen*_*nec 2 mysql sql

我有两张桌子

用户表:

id|name
Run Code Online (Sandbox Code Playgroud)

user_relationships

id | user_id | friend_id
Run Code Online (Sandbox Code Playgroud)

并希望得到2个用户的共同朋友的名字.即:

user_relationships
1 | 1 | 3
2 | 2 | 3  

users
3| sammy
Run Code Online (Sandbox Code Playgroud)

用户1和2有共同的朋友3.我想在一个查询中得到他的名字'sammy'.

我怎么做?

Niv*_*vas 6

您需要将user_relationships与其自身连接,以使具有不同的两行具有user_id相同的行friend_id

所有共同的朋友:

select ur1.user_id user1, 
       ur2.user_id user2, 
       ur2.friend_id mutual_friend
from   user_relationships ur1 
       JOIN user_relationships ur2 ON  ur1.friend_id = ur2.friend_id
where  ur1.user_id != ur2.user_id
Run Code Online (Sandbox Code Playgroud)

加入users表来获取名称:

select ur1.user_id user_id1, 
        u1.name User1, 
       ur2.user_id user2, 
        u2.name User2,
       ur2.friend_id mutual_friend_id,
        u3.name mutual_friend
from user_relationships ur1 
     JOIN user_relationships ur2 ON  ur1.friend_id = ur2.friend_id
     JOIN user u1 ON u1.user_id = ur1.user_id
     JOIN user u2 ON u1.user_id = ur2.user_id
     JOIN user u3 ON ur1.user_id = u3.user_id
where ur1.user_id != ur2.user_id
Run Code Online (Sandbox Code Playgroud)

您可以使用ur1.user_id = first_user和过滤某些特定用户的共同朋友ur2.user_id = second_user


bw_*_*ezi 6

SELECT id, name
FROM users
WHERE id IN (
  SELECT friend_id
  FROM user_relationships
  WHERE user_id IN ( 1, 2 )
  GROUP BY friend_id
  HAVING COUNT(friend_id) >= 2
)
Run Code Online (Sandbox Code Playgroud)

或者加入一个:

SELECT friend_id, name
FROM user_relationships r
  INNER JOIN users u ON r.friend_id = u.id
WHERE user_id IN ( 1, 2 )
GROUP BY friend_id
HAVING COUNT(friend_id) >= 2
Run Code Online (Sandbox Code Playgroud)