3

FQLを使用するFacebookユーザーのスレッド内のすべてのユーザースレッドとメッセージをフェッチする必要があります。

以下のFQLを実行すると、すべてのスレッドIDが返されます

select thread_id,message_count from thread where viewer_id = me() and folder_id = 0

受信トレイフォルダ内のスレッドとメッセージ数を表示し、

    {
  "data": [
    {
      "thread_id": "196940283688620", 
      "message_count": 99
    }, 
    {
      "thread_id": "283904071679203", 
      "message_count": 1
    }, 

しかし、以下のクエリを実行して、指定されたthread_id内のすべてのメッセージをフェッチするとします "thread_id": "196940283688620",

select message_id,body,viewer_id , thread_id from message where thread_id = 196940283688620 and viewer_id = me()

最初のクエリ結果は、99個のメッセージが含まれていることを示してい"thread_id": "196940283688620", ますが、クエリは20個のメッセージしか返しませんでした。

1-何が間違っているのですか?単一のFQLのスレッドですべてのメッセージをフェッチするために必要なもの、または複数のFQLが必要なものは何ですか?2-Facebook認証ユーザーのスレッド内のすべてのスレッドとメッセージをフェッチするための最良の方法は何ですか。

4

2 に答える 2

4

これに対する私の解決策は次のようなものです:

SELECT message_id,body,viewer_id, thread_id FROM message 
  WHERE thread_id = 196940283688620 AND viewer_id = me() LIMIT 0,30 

最初の30件の結果を取得し、次に

SELECT message_id,body,viewer_id, thread_id FROM message 
      WHERE thread_id = 196940283688620 AND viewer_id = me() LIMIT 30,60

次の30要素。

など...私はまだより良い解決策を見つけていません。

于 2013-11-03T15:46:11.420 に答える
3

Facebookがスレッドに表示されているすべてのメッセージを返さないという問題の場合、おそらくデフォルトの内部制限にぶつかっています。LIMITFQLのステートメントを使用して、これをバイパスできます。

SELECT message_id,body,viewer_id, thread_id FROM message 
  WHERE thread_id = 196940283688620 AND viewer_id = me() LIMIT 200

私の経験では、Facebookはオブジェクトに応じて500または5000アイテムの最大制限を設定します。最大値を超えると、返される制限よりもはるかに少ないアイテムを取得し始めます。その時点で、複数のクエリを使用してデータをページ分割する方法を見つける必要があります。

すべてのスレッドとメッセージを取得する最も効率的な方法は、FQLマルチクエリです。

クエリを次のように再構成できます:(読みやすくするために空白を追加)

 {'msg_threads':
    'SELECT thread_id,message_count FROM thread WHERE viewer_id = me() AND folder_id = 0',
  'msg_messages':
    'SELECT message_id,body,viewer_id, thread_id FROM message 
       WHERE thread_id IN (SELECT thread_id FROM #msg_threads)
       AND viewer_id = me() LIMIT 200'
  }
于 2013-03-25T14:01:48.673 に答える