我正在尝试获取所有未读收件箱的正文和发件人。
要使用未读消息获取所有会话的线程,我使用了此查询:
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
答案 0 :(得分:0)
多重查询:
在一次调用中评估一系列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 来自#query1)
*"
答案 1 :(得分:0)
我不完全确定这是否可以解决您的问题,但似乎参数是" q",而不是"查询":
params.putString("q", jsonFQL.toString());
...如果你看一下Facebook文档:
https://developers.facebook.com/docs/technical-guides/fql
可能他们最近改变了它,虽然它已被弃用,所以我不认为他们会付出太多努力。
答案 2 :(得分: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。这里唯一的问题是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
交叉检查参与者和链接是否与收件箱中的内容相符。
答案 3 :(得分: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 Platform API 2.0版是FQL的最后一个版本 将有空。 2.0之后的版本不支持FQL。请 迁移您的应用程序以使用Graph API而不是FQL。请参阅 我们对当前版本信息的更改日志。
我建议您使用以下Graph API表:
顺便说一句,FQL没有INNER JOIN
。