如何使用FQL获取未读消息



我正在尝试获取所有未读收件箱的正文和发件人。

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

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(); ....

but I got error:

errorMessage: Unsupported method, sql .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

此操作有效:

  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。请将您的应用程序迁移到使用Graph API而不是FQL。请参阅关于当前版本信息的更新日志

我建议你使用下面的图API表:

  • thread
  • message

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

多查询:

在一次调用中计算一系列FQL (Facebook查询语言)查询,并一次返回数据。

该方法接受一个json编码的字典,称为"queries",其中单个查询使用与简单查询完全相同的语法。但是,此方法允许进行更复杂的查询。您可以从一个查询中获取数据,并在同一调用中的另一个查询中使用它。WHERE子句在后一个查询中是可选的,因为它引用的数据已经被获取。要在同一调用中的另一个查询中引用一个查询的结果,请在FROM子句中指定其名称,前面加#。

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

*

"query1":"SELECT uid, rsvp_status FROM event_member WHERE .开斋节= 12345678 "

*

然后,为了获得每个与会者的个人资料数据(在本例中为姓名、URL和图片),您将执行第二个查询——query2——它引用query1的结果。您可以这样表述query2:

" *

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

*"

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

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

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

…如果你看一下Facebook文档:

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

有可能他们最近更改了它,尽管它已经被弃用了,所以我认为他们不会在这上面花太多精力。

您放置的嵌套查询

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

应该工作。如果没有,请考虑提交一个bug。

分解,

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

应该为具有未读消息的线程提供线程id。这里唯一需要注意的是,即使应用了LIMIT, unified_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有效且计数正确,那么这里就没有什么可担心的。

确保您首先获得正确的未读线程计数如果不是,如我之前所说,文件一个错误

那么通过这个查询

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

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

相关内容

  • 没有找到相关文章