首页 文章

如何使用FQL获取未读消息?

提问于
浏览
4

我试图获取所有未读收件箱的正文和发件人 .

为了使用未读消息获取所有会话的线程,我使用了以下查询:

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"

但我只从一个线程获得未读消息,而不是所有未读线程 .

我也尝试过这样的多重查询:

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'...

我在FQL中不支持JOIN

有人可以帮我在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 回答

  • 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
    

    否则,将仅检查会话的第一个 older 消息,而未读消息应该是最近的 .


    只是为了您的知识,这里是相应的多查询,它给出了相同的结果:

    {
     "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 Platform API 2.0版是FQL可用的最后一个版本 . 2.0之后的版本不支持FQL . 请迁移您的应用程序以使用Graph API而不是FQL . 有关最新版本信息,请参阅我们的更改日志 .

    我建议你使用以下Graph API表:


    顺便说一句,FQL没有这样的 INNER JOIN .

  • 0

    多查询:

    在一次调用中评估一系列FQL(Facebook查询语言)查询,并一次返回数据 .

    此方法采用名为“查询”的JSON编码字典,其中各个查询使用与简单查询完全相同的语法 . 但是,此方法允许进行更复杂的查询 . 您可以从一个查询中获取数据,并在同一个调用中的另一个查询中使用它 . WHERE子句在后一个查询中是可选的,因为它引用了已经获取的数据 . 要在同一个调用中引用另一个查询中的一个查询的结果,请在FROM子句中指定其名称,前面带有# .

    例如,假设您想获得有关参加活动的用户的一些数据 . 通常,您必须连续执行两个查询,在运行第二个查询之前等待第一个查询的结果,因为第二个查询依赖于第一个查询的数据 . 但是使用fql.multiquery,您可以同时运行它们,并获得所需的所有结果,从而提供比运行一系列fql.query调用更好的性能 . 首先,您需要获取每个与会者的用户ID和RSVP状态,因此您需要制定第一个查询 - query1 - 如下所示:

    “query1”:“SELECT uid,rsvp_status FROM event_member WHERE eid = 12345678”

    然后,为了获得每个与会者的 Profiles 数据(此实例中的名称,URL和图片),您将进行第二个查询 - 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

  • 0

    我不完全确定这是否解决了您的问题,但似乎参数是“q”,而不是“查询”:

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

    ...如果你看一下Facebook文档:

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

    可能他们最近改变了它,虽然它已被弃用,所以我不认为他们会付出很多努力 .

  • 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 folder ='inbox'AND unread = 1

    应该为具有未读消息的线程提供线程ID . 这里唯一的问题是,即使应用 LIMITunified_thread 也不一定返回所有线程 . 所以你在这里做的很好(只要未读响应集足够小)

    如果此时数字与您所拥有的数字不匹配,则在查询中进一步移动是没有意义的 . 提交错误 .

    更大的查询

    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有效且正确计数,就不必担心这里 .

    Ensure you are getting the correct count of unread threads first 如果没有,正如我之前所说,提交一个错误 .

    这样用这个查询

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

    交叉检查参与者和链接匹配您收件箱中的内容 .

相关问题