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 回答