0

過去数日間にユーザーのFacebookの友達が共有した最新のリンクを取得しようとしています。過去7日間で次のようにしましょう。

FQLを使用すると、一度に最大20人の友達がこれを取得できます。

$fql = "SELECT link_id, owner, created_time, title, summary, url, image_urls FROM link WHERE owner IN (select uid2 from friend where uid1 = me() LIMIT 20) AND created_time >= $_7ago";

友達数の制限を20からそれ以上に設定すると、クエリがクラッシュします。私の現在の解決策は、このクエリを繰り返して、(たとえば)1000人の友人をループ内の20人のグループに分割することです。これは実際には機能しましたが、実行には5分以上かかります。

私もこの方法でマルチクエリを試しました(そして速度は向上していません):

"links":"select uid2 from friend where uid1 = me() LIMIT 20",
"stats":"SELECT owner, owner_comment, title, summary, url, image_urls FROM link WHERE owner IN (select uid2 from #links) AND created_time  >= \"' . $_7ago . '\""

より速い代替/解決策はありますか?

http://www.pixable.com/<-3 秒以内に友達が共有する毎月の写真をプルすることができます

4

1 に答える 1

0

マルチクエリを使用して、関連のない複数のクエリを実行することもできます。最初にフレンドのuidを取得し、次にuidをチャンクに分割して個々のクエリを作成し、すべてのクエリを一度に実行します。js SDKでは、これは次のようになります。

FB.api( {
    method: 'fql.multiquery',
    queries: [
            'SELECT owner, owner_comment, title, summary, url, image_urls FROM link WHERE owner IN ('+chunk0+') AND created_time  >= '+time,
            'SELECT owner, owner_comment, title, summary, url, image_urls FROM link WHERE owner IN ('+chunk1+') AND created_time  >= '+time,
            'SELECT owner, owner_comment, title, summary, url, image_urls FROM link WHERE owner IN ('+chunk2+') AND created_time  >= '+time
     ]}, function(results) {
     console.log(results); // array with the individual query results
         var query_results = null;
         var row = null;
         for (var i = 0, l = results.length; i < l; ++i) {
             var query_results = results[i];
             for (var i2 = 0, l2 = query_results.fql_result_set.length; i2<l2; ++i2) {
                 row = query_results.fql_result_set[i2];
                 console.log(row);
                 // at this point row variable contains individual rows from the link table
                 // with the selected fields
                 console.log(row.owner, row.title); // should log something useful
             }
         }
     }
);

ドキュメントには、これはバッチAPIインターフェースを使用するよりも高速である必要があると記載されています。

このメソッドは、batch.runを使用して一連のfql.query呼び出しを実行するよりも優れたパフォーマンスを発揮します。

ファイアバグでは、最初のconsole.log(results)ものはこれに似たものを表示するはずです(実際のIDはスペースの制約のために削除/切り捨てられます): 結果のFirebugコンソール出力

于 2012-08-16T06:28:37.957 に答える