【问题标题】:How to get unread messages using FQL?如何使用 FQL 获取未读消息?
【发布时间】:2014-07-29 13:42:48
【问题描述】:

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

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

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

【问题讨论】:

  • 我不认为它是重复的,我在发布之前阅读了它们,这就是为什么我编写了我在这些链接中建议使用的多查询和嵌套查询,但它不起作用
  • FQL 将在 API 2.1 版本中被弃用,所以我不鼓励您使用 FQL 进行新开发。由于 FQL 错误,某些线程可能无法获取,但他们的 API 团队没有任何意义来修复已弃用的 API 错误。

标签: android facebook facebook-fql inbox facebook-sdk-3.14.x


【解决方案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 
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。请参见 当前版本信息的更新日志。

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


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

【讨论】:

    【解决方案2】:

    多查询:

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

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

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

    *

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

    *

    然后,要获取每个与会者的个人资料数据(在本例中为姓名、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

    【讨论】:

      【解决方案3】:

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

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

      ...如果您查看 Facebook 文档:

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

      可能他们最近对其进行了更改,尽管它已被弃用,所以我认为他们不会为此付出太多努力。

      【讨论】:

        【解决方案4】:

        您放置的这个嵌套查询

        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。这里唯一的问题是unified_thread 不一定返回所有线程,即使使用LIMITapplied。所以你在这里做的很好(只要未读响应集足够小)

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

        更大的查询

        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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-12-23
          • 2014-05-16
          • 1970-01-01
          • 2010-09-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多