0

私はユーザーテーブルを持っています

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

そして友達のテーブル

id , u1 , u2 , status , reciver

友達を読む速度を上げるために、友達ごとに2行をテーブルに追加することにしたので、次のようになります

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のようにこれら2つの間の共通の友達を数えたいと思っています

ここに私の友達リストのクエリがあります:

         $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';

        }

だから私はプロファイル ID ($profile_id) の所有者を friends.u1 に対してチェックし、friends.u2 (設立された友人) を users テーブルに参加させて、彼のユーザー名と ID を取得します

問題は共通の友達を数えることです

私は、設立された各友人に自分自身で友人テーブルに参加します

紙の上では問題ないように見えますが、奇妙な結果が返されます

ユーザーに 3 人の友達がいて、共通の友達がいない場合と同様に、3 人の友達のうちの 1 人だけが返されます。

また、相互の友達がいる場合はすべての友達が表示されますが、ほとんどの場合、相互の友達の数は間違っています

group by ステートメントに問題があります

4

1 に答える 1

1

2 つだけのフレンド テーブルではこれを行うことはできません。3 つ目のテーブルが必要になります。

  • 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 に答える