改善朋友列表查询:统计共同的朋友

max*_*max 6 php mysql database-design

我的数据库中有两个表,一个用于保存用户信息(users_table),另一个用于跟踪朋友

users_table:

id    username      avatar  
1         max       max.jpg  
2         jack      jack.jpg  
Run Code Online (Sandbox Code Playgroud)

friends_table:

id    u1_id      u2_id  
1         1          2  
2         1          3  
Run Code Online (Sandbox Code Playgroud)

在每个用户个人资料中,我显示他/她的朋友列表

这是我的查询

select u.id,
    u.username,
    u.avatar
from friends_table f
join users_table u on f.u1_id = u.id || f.u2_id = u.id
where u.id <> $profile_id
    and (f.u1_id = $profile_id || f.u2_id = $profile_id)
Run Code Online (Sandbox Code Playgroud)

此查询选择个人资料所有者的朋友($ profile_id)

并使用用户表加入它们以获取每个朋友的用户名和头像

现在我想要计算每个朋友和个人资料所有者之间的共同朋友是否可以在一个查询中进行此操作,或者我应该为每个成立的朋友做一些长而且可能很慢的查询(这只是一个示例,它可能有一些语法错误):

       foreach ( $friends_list_query_resul as $qr ){
       $friend_id = $qr['id'];

       $mutual_count = mysql_query
    ( "select count(*) from friends_table where 
    ($u1_id = $friend_id || $u2_id = $friend_id )
               && 


    ( $u1_id IN ( SELECT `u1_id`,`u2_id` from friends_table where
     ($u1_id = $profile_id || $u2_id = $profile_id ) )

||

      $u2_id IN ( SELECT `u1_id`,`u2_id` from friends_table where
     ($u1_id = $profile_id || $u2_id = $profile_id ) )


       ")
        }
Run Code Online (Sandbox Code Playgroud)

max*_*max 0

我决定为表中的每个朋友关系添加两行。

id    u1_id      u2_id  
1         10         20  
2         20         10
Run Code Online (Sandbox Code Playgroud)

它使这个过程变得更容易和更快。