我正在尝试获取所有未读收件箱的正文和发件人。
获取所有会话线程的未读消息,我使用了这个查询:
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
交叉检查参与者和链接是否与您的收件箱中的内容匹配。