Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Finding mutual friend sql

Actually, I have 2 tables the friend table and the users table what I try to achieve is to retrieve my mutual friend by checking the friend of another user and get the data of these mutual friends from the user's table

table friend is built like this

id | user1 | user2 | friend_status

then the table data looks like this

1 | 1 | 2 | 1
2 | 1 | 3 | 1
3 | 2 | 3 | 1
4 | 1 | 4 | 1
5 | 2 | 4 | 1

Then let's say that I am the user with id 2, then in that table, I have 3 friends - 1, 3 and 4. What I want to retrieve are the common friends with user 1 that have also 3 friends - 2, 3 and 4 and retrieve the data from the table users for the 2 common mutual friend 3 and 4

like image 206
Mireille28 Avatar asked Oct 26 '25 06:10

Mireille28


2 Answers

You can use a UNION to get a users friends:

SELECT User2 UserId FROM friends WHERE User1 = 1
  UNION 
SELECT User1 UserId FROM friends WHERE User2 = 1

Then, joining two of these UNION for two different Users on UserId you can get the common friends:

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
like image 182
xpy Avatar answered Oct 28 '25 22:10

xpy


Here's a way using union all to combine all friends of user 1 and user 2 and using count(distinct src) > 1 to only select those that are friends with both users.

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
like image 35
FuzzyTree Avatar answered Oct 28 '25 21:10

FuzzyTree



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!