按查询加入/分组返回奇怪的结果

时间:2012-05-24 01:02:29

标签: php mysql

我有一个用户表

 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(已建立的朋友)加入users表以获取其用户名和ID

问题在于计算共同的朋友

我自己加入了朋友桌 在每个成立的朋友

在报纸上似乎没问题,但它会返回一些奇怪的结果

如果用户有3个朋友,并且没有共同的朋友,则只返回3个朋友中的一个 !

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

group by statement

存在问题

1 个答案:

答案 0 :(得分:1)

你不能只用2个朋友表来做,你需要第三个:

  • 好友1:选择用户$ profile_id的朋友(就像你一样)
  • 好友2:选择$ profile_id(你有)的朋友的朋友
  • 朋友3:找出朋友之间的共同朋友 $ 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