3

私は、共通の友人の数が最も多い友人を見つけたいと思っています。
私は次のようにFQLとグラフAPIでそれをやろうとしました:

  1. 現在ログインしているユーザーのフレンド リストを取得します。
    FQL:SELECT uid1 FROM friend WHERE uid2="MY_USER_ID" and uid1 IN (SELECT uid1 FROM friend WHERE uid2=me())
    グラフ API:$facebook->api('/me/friends?format=json&limit=5000')

  2. リスト内の uid ごとに、共通の友達のリストを取得して数えることができます。
    FQL:SELECT uid1 FROM friend WHERE uid2="OTHER_USER" and uid1 IN (SELECT uid1 FROM friend WHERE uid2=me())
    グラフ API:$facebook->api('me/mutualfriends/OTHER_USER')

ただし、これをすべての友人に実行するには非常に時間がかかります...それ
行うためのより良い方法に精通していますか?

4

4 に答える 4

9

相互の友人の数が最も多い友人のリストを取得することだけが目標である場合、つまり、相互の友人が誰であるかを気にしない場合、実際にはGeoffのFQL呼び出しは、必要以上の情報を提供します。

また、GeoffのFQLは非常に多くのデータを返し、Facebookは実際にデータを切り捨てていることに気付きました。

その上、あなたは同じFQl呼び出しでそれらの友人の名前を取得したいかもしれません...

見栄えの良い代替FQLは次のとおりです。

SELECT name,mutual_friend_count FROM user WHERE uid IN(
SELECT uid2 FROM friend WHERE uid1=me())

これにより、友達リストから相互の友達の数が返されます。したがって、500人の友達がいる場合、500個のオブジェクトでのみ応答が返されます。

于 2012-03-03T13:05:19.663 に答える
4

次のステップへのGeoffの答えを取り上げて、これがPHPの完全なソリューションです。

まず、GeoffのFQLは次のとおりです。

SELECT uid1, uid2 FROM friend  
  WHERE uid1 IN 
  (SELECT uid2 FROM friend WHERE uid1=me())
   AND uid2 IN 
  (SELECT uid2 FROM friend WHERE uid1=me())

そして、これがJSONを取得し、どの友達があなたと最も相互の友達を持っているかを確認するためのPHPコードです。(URLのアクセストークンを必ず置き換えてください。)

<?php
$jsonurl = "https://api.facebook.com/method/fql.query?query=SELECT+uid1%2C+uid2+FROM+friend++%0A++WHERE+uid1+IN+%0A++%28SELECT+uid2+FROM+friend+WHERE+uid1%3Dme%28%29%29%0A+++AND+uid2+IN+%0A++%28SELECT+uid2+FROM+friend+WHERE+uid1%3Dme%28%29%29&access_token=***INSERTACCESSTOKENHERE***&format=json";
$json = file_get_contents($jsonurl,0,null,null);
$json_output = json_decode($json,true);

for ($friendship = 0; $friendship <= count($json_output); $friendship++)
{
    $firstfriend = $json_output[$friendship]["uid1"];
    $mutualfriendscount[$firstfriend] = isset($mutualfriendscount[$firstfriend]) ? $mutualfriendscount[$firstfriend] + 1 : 1;
}

$mostmutualfriends_count = 0;

foreach ($mutualfriendscount as $friend => $mutualfriendcount)
{
    if ($mutualfriendcount > $mostmutualfriends_count)
    {
        $mostmutualfriends_count = $mutualfriendcount;
        $mostmutualfriends_id = $friend;
    } 
}
echo "ID $mostmutualfriends_id has the most number of mutual friends with you: $mostmutualfriends_count."

?>
于 2012-01-11T23:07:08.423 に答える
3

このようなクエリを使用して、共通の友達を取得しました。

SELECT uid1, uid2 FROM friend  
  WHERE uid1 IN 
  (SELECT uid2 FROM friend WHERE uid1=me())
   AND uid2 IN 
  (SELECT uid2 FROM friend WHERE uid1=me())

友達の共通の友達をすべてすばやく返します。

于 2011-12-04T18:41:59.987 に答える
0

最終的に何を達成したいのか正確にはわかりません。しかし、リストの上位の友達を探している場合は、フィードを取得して、投稿数に応じて友達をランク付けすることでそれを実現できます。

$fql="SELECT actor_id FROM stream WHERE filter_key = 'others' AND source_id = me() ORDER BY actor_id LIMIT 3000";
$param=array(
            'method'    => 'fql.query',
            'query'     => $fql,
            'callback'  => ''
        );
        $fqlResult1   =   $this->facebook->api($param);
        $top_frds=array();
        foreach($fqlResult1 as $result1)
        {
            $top_frds[]=$result1['actor_id'];
        }


$new_array = array();
foreach ($top_frds as $key => $value) {
if(isset($new_array[$value]))
    $new_array[$value] += 1;
else
    $new_array[$value] = 1;
}
$top_frds=array();
foreach($new_array as $tuid => $trate)
{
$top_frds[]=array('uid'=>$tuid,'rate'=>$trate);
}
于 2011-12-04T18:48:09.550 に答える