5
Reply

Find the number of a user's friends' friend who are also the user's friend. Output the user id along with the count.

Table: google_friends_network
The Table Consists of two attributes: user_id and Friend_id

Goal
Find the count of Mutual Friends’ respective to each user_id.

    SELECT g1.user_id,COUNT(DISTINCT g2.friend_id) AS mutual_friend_count
    FROM google_friends_network g1
    JOIN google_friends_network g2ON g1.friend_id = g2.user_id
    JOIN google_friends_network g3ON g1.user_id = g3.user_idAND g2.friend_id = g3.friend_id
    WHERE g2.friend_id <> g1.user_id
    GROUP BY g1.user_id
    ORDER BY g1.user_id;

    How it works

    • g1.friend_id = g2.user_id finds each user’s friends’ friends.

    • g2.friend_id = g3.friend_id checks whether that friend-of-friend is also already a direct friend of the same user.

    • COUNT(DISTINCT ...) avoids double counting.simulation games

    • g2.friend_id <> g1.user_id excludes the user themself.

    If the table stores each friendship only once and not bidirectionally, this query assumes the direction in the table already reflects the friend relation you want.

    Great post. Learned a lot from this. Keep writing more.

    1. WITH UserFriends AS (
    2. SELECT user_id, friend_id
    3. FROM google_friends_network
    4. )
    5. SELECT
    6. uf.user_id,
    7. COUNT(DISTINCT gf.friend_id) AS mutual_friend_count
    8. FROM
    9. UserFriends uf
    10. JOIN
    11. google_friends_network gf ON uf.friend_id = gf.user_id
    12. GROUP BY
    13. uf.user_id;

    How about

    1. WITH UserFriends AS (
    2. SELECT user_id, friend_id
    3. FROM google_friends_network
    4. ), FriendsOfFriends AS (
    5. SELECT uf.user_id, gf.friend_id AS friend_of_friend
    6. FROM UserFriends uf
    7. JOIN google_friends_network gf ON uf.friend_id = gf.user_id
    8. )
    9. SELECT user_id, COUNT(DISTINCT friend_of_friend) AS mutual_friend_count
    10. FROM FriendsOfFriends
    11. GROUP BY user_id;

    You can use below query in SQL.

    1. WITH UserFriends AS (
    2. SELECT user_id, friend_id
    3. FROM google_friends_network
    4. ),
    5. FriendsOfFriends AS (
    6. SELECT uf.user_id, gf.friend_id AS friend_of_friend
    7. FROM UserFriends uf
    8. JOIN google_friends_network gf ON uf.friend_id = gf.user_id
    9. ),
    10. MutualFriends AS (
    11. SELECT fof.user_id, COUNT(1) AS mutual_friend_count
    12. FROM FriendsOfFriends fof
    13. JOIN google_friends_network uf ON fof.user_id = uf.user_id AND fof.friend_of_friend = uf.friend_id
    14. GROUP BY fof.user_id
    15. )
    16. SELECT user_id, mutual_friend_count
    17. FROM MutualFriends;