我需要为具有FQL的facebook用户获取线程内的所有用户线程和消息。
当我运行以下FQL时,它返回所有线程ID
select thread_id,message_count from thread where viewer_id = me() and folder_id = 0
在收件箱文件夹中显示主题和消息计数
{
"data": [
{
"thread_id": "196940283688620",
"message_count": 99
},
{
"thread_id": "283904071679203",
"message_count": 1
},
但是当我运行以下查询来获取给定thread_id中的所有消息时,假设 "thread_id": "196940283688620",
select message_id,body,viewer_id , thread_id from message where thread_id = 196940283688620 and viewer_id = me()
由于第一个查询结果显示我在 "thread_id": "196940283688620",
中有99条消息,但查询只返回了20条消息。
1-我错了什么?我需要在单个FQL中获取线程中的所有消息,还是需要多个FQL? 2-对于经过Facebook身份验证的用户,获取线程内所有线程和消息的最佳方法是什么。
答案 0 :(得分:4)
我的解决方案是这样的:
SELECT message_id,body,viewer_id, thread_id FROM message
WHERE thread_id = 196940283688620 AND viewer_id = me() LIMIT 0,30
获得前30个结果 然后
SELECT message_id,body,viewer_id, thread_id FROM message
WHERE thread_id = 196940283688620 AND viewer_id = me() LIMIT 30,60
接下来的30个元素。
等等......我还没有找到更好的解决方案。
答案 1 :(得分:3)
对于Facebook没有返回线程中显示的所有消息的问题,您可能会遇到默认的内部限制。您可以通过在FQL中使用LIMIT
语句来绕过此:
SELECT message_id,body,viewer_id, thread_id FROM message
WHERE thread_id = 196940283688620 AND viewer_id = me() LIMIT 200
根据我的经验,Facebook根据对象设置最多500或5000项。当您超过最大值时,您将开始获得的项目少于您返回的限制。此时,您需要找到一种通过多个查询对数据进行分页的方法。
至于获取所有线程和消息的最有效方法,它是FQL multiquery。
您可以将查询重组为如下所示:(为了便于阅读而添加了空格)
{'msg_threads':
'SELECT thread_id,message_count FROM thread WHERE viewer_id = me() AND folder_id = 0',
'msg_messages':
'SELECT message_id,body,viewer_id, thread_id FROM message
WHERE thread_id IN (SELECT thread_id FROM #msg_threads)
AND viewer_id = me() LIMIT 200'
}