9

我正在尝试使用 PHP/FQL 选择所有共同朋友的连接。使用我的 UID(540 个朋友),这意味着 >12,000 个连接,其中 >6500 个是唯一的。因此,此代码返回所有连接,但 Facebook 显然对 FQL 查询有 4999/5000 行限制。

// select mutual unique friends
 $unique_connections = $facebook->api_client->fql_query("

  SELECT uid1, uid2 FROM friend 
   WHERE uid1 IN 
   (SELECT uid2 FROM friend WHERE uid1=$uid)
   AND uid2 IN 
   (SELECT uid2 FROM friend WHERE uid1=$uid)
 ");

我知道上面的数字是因为我编写的原始代码循环遍历我的朋友列表并为每个人发送一个 getMutualFriend 查询。

foreach ($friends as $key) 
{
    $mutual_friends = $facebook->api_client->friends_getMutualFriends($key);
    foreach ($mutual_friends as $f_uid)
    {
        array_push($all_connections, array($key,$f_uid)); 
    }
}

Of course it takes almost 3 minutes to run that script, while the FQL query returns in 5 seconds. After an hour of searching for this answer I've come to the conclusion the only way to get around this is to use a mixture of the two methods. Well that, and post here. Any ideas on a better way to write this script and beat the 4999/5000 row limit?

Here's an fql_multiquery that should do the same as above. It is also limited to 4999/5000.

$queries = '{
"user_friends":"SELECT uid2 FROM friend WHERE uid1 = '.$uid.'",
"mutual_friends":"SELECT uid1, uid2 FROM friend WHERE uid1 IN (SELECT uid2 FROM #user_friends) AND uid2 IN (SELECT uid2 FROM #user_friends)"
}';

$mq_test = $facebook->api_client->fql_multiquery(trim($queries));
print_r($mq_test);
4

7 回答 7

7

所以,我发布了我原来问题的答案。我能够通过对 UID 数组进行分块(使用适当命名的 array_chunk() PHP 函数)并循环遍历这些块以执行迷你查询,然后将其全部附加到一个数组中,从而规避了 FQL 查询的 5000 行限制. 超过 12,000 行的整个脚本平均需要 14 秒,因此这是一个巨大的改进。您可以在此处查看正在运行的应用程序:givememydata.com

哦,Facebook 应该重新考虑他们的(仍然没有记录的)FQL 行限制。对他们的服务器征税更多的是什么?在 5 秒内执行的单个查询或需要 180 秒的 500 个查询?对不起,不得不发泄。;-)

于 2010-11-27T23:32:46.497 回答
5
$mutual_friends = $facebook->api('/me/mutualfriends/friendid');
于 2012-07-09T11:49:44.093 回答
1

An alternative would be to use the fql.multiquery method, and build a seperate FQL query for each friend (or a group of friends per FQL query), but still sending all queries in the same request.

于 2010-11-26T14:36:23.767 回答
1

一个有趣的观察:当我试图找到所有与我有共同朋友的人时,我使用以下查询

从朋友那里选择 uid1,uid2 在哪里 uid1(从朋友那里选择 uid2,哪里 uid1=$uid)

如您所见,它与您的查询非常相似,只是我删除了 AND 子句。

我收到以下错误消息:“无法查找 208733 的所有朋友。只能查找登录用户或登录用户的作为您应用程序用户的朋友”。

我猜 facebook 足够聪明,可以发现我正在尝试做一些它不想让我做的事情。它以某种方式检测到您正在尝试仅查找您朋友的朋友同时也是您的朋友的事实,而我正在尝试查找我朋友的所有朋友。

于 2012-02-03T06:41:01.437 回答
0

FQL supports a LIMIT, just like regular SQL. You may try that. http://developers.facebook.com/docs/guides/performance

否则,我建议获取每个用户的朋友 ID,将它们存储在 SQL 表中,然后执行您自己的连接以获得交叉。您可以只获取一次好友列表,然后订阅实时更新以使您的列表保持最新。 http://developers.facebook.com/docs/api/realtime

于 2010-11-26T18:34:24.227 回答
0

我似乎能够使用的一个技巧是根据表中的一个可索引列(使用 strpos(column_name, character / number))限制查询的数量。

前任:

$fql = "SELECT pid,src_big,owner FROM photo WHERE album_object_id IN 
      (SELECT object_id FROM privacy WHERE 
             ( object_id IN ( SELECT object_id FROM album WHERE owner IN (SELECT uid2 FROM friend WHERE 
                   ( uid1 = " . $this->nextUser->fbid . " AND **strpos(uid2,2) = 1**  )))                                   
           AND ( value = 'FRIENDS_OF_FRIENDS' OR value = 'EVERYONE'  ) )) ;

通过这种方式,您可以将其拆分为 10 个子查询,或者将其拆分为 33 个字母数字字段。

于 2012-03-20T20:22:22.040 回答
0

我正在做类似的事情——但获得了 fb 页面帖子——当我用多查询处理它时,在 FB 服务器上遇到了有趣的缓存——批处理 FQL 是解决这个问题的一种方法,顺便说一句。是的,遇到了 5K 的限制,只是批量低于 5k,不得不设置分页,这很痛苦。

于 2012-07-11T07:54:40.593 回答