4

すべての未読 inbox の本文と送信者を取得しようとしています。

未読メッセージのあるすべての会話のスレッドを取得するには、次のクエリを使用しました。

SELECT thread_id from unified_thread WHERE folder='inbox' AND unread=1

スレッドの未読メッセージを取得するには、このクエリを使用しました

SELECT sender,body FROM unified_message WHERE unread=1

次のネストされたクエリを試しました:

SELECT sender,body FROM unified_message WHERE thread_id IN (SELECT thread_id FROM unified_thread  WHERE folder = 'inbox' AND unread=1) AND unread=1"

しかし、すべての未読スレッドではなく、1 つのスレッドからのみ未読メッセージを取得します。

次のようなマルチクエリも試しました。

String query1="SELECT thread_id FROM unified_thread WHERE folder='inbox' AND unread=1";
String query2="SELECT timestamp,sender,body FROM unified_message WHERE unread=1 AND thread_id IN (SELECT thread_id FROM #query1)";
Bundle params = new Bundle();
JSONObject jsonFQL=new JSONObject();
try {
        jsonFQL.put("query1",query1);
        jsonFQL.put("query2",query2);
} catch (JSONException e) {
        e.printStackTrace();
}

params.putString("method","fql.multiquery");
params.putString("queries", jsonFQL.toString());
new Request(session,"/fql",params,HttpMethod.GET,new Request.Callback(){
      public void onCompleted(Response response) {
                                     ...
                                 }
                     ).executeAsync(); ....

しかし、私はエラーが発生しました:

errorMessage: サポートされていないメソッド、fql.multiquery

次に、INNER JOIN で試しました。

SELECT unified_message.sender,unified_message.body 
            FROM unified_message 
            INNER JOIN unified_thread 
            ON unified_message.thread_id=unified_thread.thread_id
            WHERE unified_thread.unread=1

しかし、私はこのエラーが発生しました:

パーサー エラー: 位置に予期しない 'INNER' があります...

JOIN が FQL でサポートされていないことを知りました

誰かがFQLでこのクエリを実行する手を貸してくれませんか??

必要な出力の例: さまざまな人と 5 つの会話をしていますが、未読メッセージがあるのは 3 つの会話だけです。だから私はこのようなものを取得したいと思います:

UNREAD MESSAGES

Sender: Anna 
Body: hello dude 
Body: how are you? 
Body: I miss you

Sender: John
Body: please help me 

Sender: Erick 
Body: nice
Body: buddy
4

4 に答える 4

0

これは機能します:

  SELECT sender, body FROM unified_message 
   WHERE thread_id IN 
         (SELECT thread_id FROM unified_thread WHERE folder = 'inbox' AND unread=1) 
     AND unread=1 
ORDER BY timestamp DESC

以下を使用して、取得したメッセージを降順でソートすることが重要です。

ORDER BY timestamp DESC

それ以外の場合は、会話の最初の古いメッセージのみが検査されますが、未読のメッセージは最近のものである必要があります。


参考までに、同じ結果が得られる対応するマルチクエリを次に示します。

{
 "threads":"SELECT thread_id FROM unified_thread WHERE folder='inbox' AND unread=1",
 "messages":"SELECT sender, body FROM unified_message WHERE thread_id IN (SELECT thread_id FROM #threads) AND unread=1 ORDER BY timestamp DESC"
}

ただし、FQL はもう使用しないでください。

Facebook プラットフォーム API のバージョン 2.0 は、FQL を利用できる最後のバージョンです。2.0 以降のバージョンは FQL をサポートしません。FQL の代わりに Graph API を使用するようにアプリケーションを移行してください。現在のバージョン情報については、変更ログを参照してください。

次のグラフ API テーブルを使用することをお勧めします。


ちなみに、FQLにはそのようなものはありませんINNER JOIN

于 2014-08-11T18:31:52.180 に答える
0

あなたが配置したこのネストされたクエリ

SELECT sender,body FROM unified_message WHERE thread_id IN (SELECT thread_id FROM unified_thread WHERE folder = 'inbox' AND unread=1) AND unread=1

動作するはずです。そうでない場合は、バグを報告することを検討してください。

それを分解すると、

SELECT thread_id FROM Unified_thread WHERE フォルダー = '受信トレイ' AND 未読 = 1

未読メッセージのあるスレッドのスレッド ID を提供する必要があります。ここでの唯一の問題はunified_thread、適用されていてもすべてのスレッドが返されるとは限らないことLIMITです。したがって、ここで行ったことは適切でした (未読の応答セットが十分に小さい場合)。

この時点で数値が一致していない場合は、クエリをさらに進めても意味がありません。バグを報告します。

より大きなクエリ

SELECT sender,body FROM unified_message WHERE thread_id IN (SELECT thread_id FROM unified_thread WHERE folder = 'inbox' AND unread=1) AND unread=1

スレッド内のすべてのメッセージをチェックするため、スレッド ID が有効で正しくカウントされている限り、ここで心配する必要はありません。

最初に、未読スレッドの正しい数を取得していることを確認してください。そうでない場合は、前に述べたように、バグを報告してください。

したがって、このクエリでは

SELECT thread_id, participants, link FROM unified_thread WHERE folder = 'inbox' AND unread

参加者とリンクが受信トレイにあるものと一致することをクロス チェックします。

于 2014-08-11T18:22:30.467 に答える
0

マルチクエリ:

一連の FQL (Facebook クエリ言語) クエリを 1 回の呼び出しで評価し、一度にデータを返します。

このメソッドは、個々のクエリが単純なクエリとまったく同じ構文を使用する「クエリ」と呼ばれる JSON でエンコードされた辞書を使用します。ただし、この方法では、より複雑なクエリを作成できます。1 つのクエリからデータをフェッチし、同じ呼び出し内の別のクエリで使用できます。後者のクエリでは、既にフェッチされたデータを参照するため、WHERE 句はオプションです。あるクエリの結果を同じ呼び出し内の別のクエリで参照するには、FROM 句でその名前を # の後に指定します。

たとえば、イベントに参加しているユーザーに関するデータを取得したいとします。通常、2 番目のクエリは最初のクエリのデータに依存するため、最初のクエリの結果を待ってから 2 番目のクエリを実行し、2 つのクエリを続けて実行する必要があります。しかし、fql.multiquery を使用すると、それらを同時に実行して、必要なすべての結果を取得できるため、一連の fql.query 呼び出しを実行するよりもパフォーマンスが向上します。まず、各出席者のユーザー ID と RSVP ステータスを取得する必要があるため、最初のクエリ (query1) を次のように作成します。

*

"query1":"select uid, rsvp_status FROM event_member WHERE eid=12345678"

*

次に、各出席者のプロファイル データ (この例では名前、URL、および写真) を取得するために、2 つ目のクエリ (query2) を作成します。これは、query1 の結果を参照します。次のように query2 を定式化します。

"*

query2":"SELECT name, url, pic FROM profile WHERE id IN (SELECT uid FROM #query1)

*"

https://developers.facebook.com/docs/technical-guides/fql

于 2014-08-11T10:05:03.100 に答える
0

これで問題が解決するかどうかは完全にはわかりませんが、パラメーターは「クエリ」ではなく「q」のようです。

params.putString("q", jsonFQL.toString());

...Facebook のドキュメントを参照すると、次のようになります。

https://developers.facebook.com/docs/technical-guides/fql

最近変更された可能性がありますが、廃止されているため、あまり力を入れないと思います。

于 2014-08-11T18:03:13.080 に答える