0

我有一个用户表

 id , username
 22 , max
 33 , jack
 44 , joe

和朋友桌

id , u1 , u2 , status , reciver

为了提高阅读朋友的速度,我决定为每个友谊在表格中添加两行,所以它是这样的

id , u1 , u2 , status , reciver

 1 , 22 , 33 ,  1     ,  22
 2 , 33 , 22 ,  1     ,  22


 3 , 22 , 44 ,  1     ,  22
 4 , 44 , 22 ,  1     ,  22

 5 , 22 , 55 ,  1     ,  22
 6 , 55 , 22 ,  1     ,  22

现在我想获取每个用户的朋友,并计算这两个用户之间的共同朋友,比如 facebook

这是我的朋友列表查询:

         $profile_id = $current_user->id;

         $res = $db->query("
            select 
            u.id as firend_id, 
            u.username  as firend_name,
            f.status    as firendship_status,
            COUNT(f3.u2)  as mutual  

            from friends f      
              JOIN users  u on f.u2 = u.id
              LEFT JOIN friends f2 on f.u2 = f2.u1 and f2.u2 != $profile_id
              LEFT JOIN friends f3 on f3.u1 = $profile_id AND f3.u2=f2.u2     
            WHERE  f.u1 = $profile_id
            group by f2.1
           ");

        echo 'friends list : '
        foreach ($res->result() as $r ){

          echo $r->firend_name;
          echo $r->mutual.' friends';

        }

所以我对照friends.u1检查个人资料ID($profile_id)的所有者并将friends.u2(建立的朋友)加入用户表以获取他的用户名和ID

问题在于计算共同的朋友

我在每个已建立的朋友中加入了自己的朋友表

在纸上看起来没问题,但它返回了一些奇怪的结果

就像用户有 3 个朋友并且没有共同的朋友一样,它只返回 3 个朋友中的一个!

如果有共同的朋友,它会显示所有的朋友,但在大多数情况下,共同的朋友号码是错误的

group by 语句有问题

4

1 回答 1

1

您不能仅使用 2 个朋友表来执行此操作,您需要第三个:

  • Friends1:选择用户 $profile_id 的朋友(如你所见)
  • Friends2:选择$profile_id的好友的好友(如你所愿)
  • Friends3:计算$profile_id好友的好友与$profile_id好友的共同好友

我没有测试以下内容,它适用于我的样本数据 - 只需仔细检查更大的样本:

        select  
        u.id as firend_id,  
        u.username  as firend_name, 
        f.status    as firendship_status, 
        COUNT(f3.u2)  as mutual 

        from friends f       
          JOIN users  u on f.u2 = u.id 
          LEFT JOIN friends f2 on f.u2 = f2.u1 and f2.u2 != $profile_id 
          LEFT JOIN friends f3 on f3.u1 = $profile_id AND f3.u2=f2.u2

        WHERE  f.u1 = $profile_id 
        group by f.u2
于 2012-05-24T03:57:00.590 回答