我试图向Facebook查询我朋友发布的最近50张照片。
听起来很容易,对吗?到目前为止,我发现了使用FQL的两种不同方法,但都不起作用。
SELECT pid, owner, src_big, caption, created
FROM photo WHERE owner IN (
SELECT uid1 FROM friend WHERE uid2=me()
) ORDER BY created DESC LIMIT 50
问题在于,当我真正想要广度优先搜索时,它正在进行深度优先搜索。它通过我的朋友列表,找到了第一个带有一堆照片的朋友,然后给了我她最近的照片,忽略了朋友列表中朋友的更多近期照片
SELECT pid, owner, src_big, caption, created
FROM photo where pid in (
SELECT attachment.media.photo.pid
FROM stream
WHERE filter_key IN (
SELECT filter_key FROM stream_filter WHERE uid=me()
) AND type = 247
ORDER BY created_time DESC
LIMIT 50
)
这更接近我想要的东西,除了它也会从页面给我照片,我只想要朋友的照片。据我所知,没有办法按类型过滤uid
(例如朋友,页面等)。
我错过了什么?还有第三种方式吗?这不可能吗?
答案 0 :(得分:2)
我尝试了你的查询和超时错误(此时):
您的主键应首先将filter_key与 app_2305272732 放在仅返回照片的位置,而不是之后按类型= 247进行过滤,以便获得更多结果:
SELECT pid, owner, src_big, caption, created FROM photo where pid IN(SELECT attachment.media.photo.pid FROM stream WHERE filter_key='app_2305272732' AND actor_id IN(SELECT uid1 FROM friend WHERE uid2=me()) AND created_time<=now() ORDER BY created_time DESC LIMIT 200)
正如您所看到的,actor_id只包含朋友,但如果您直接放置actor_id,响应可以更快(对于2000位朋友约为2秒),因此您可以考虑缓存朋友ID(取决于您的应用流程)
actor_id IN(FRIEND_ID1,FRIEND_ID2,FRIEND_ID3 ......)
此外,无法保证一次拍摄50张照片,但您可以按created_time导航到下一页(从上一张照片的创建字段中获取)。甚至认为照片表中创建的时间可能与流表略有不同(约1秒),但它应该可以接受。
created_time<CREATED
最后,您应该增加限制,这样您可以立即获得更多结果。我发现200是可以接受的,我可以在一页中获得超过20张照片。
LIMIT 200
<强>更新强>
您应该使用 source_id 而不是 actor_id 来获得更多结果。所以正确的查询是:
SELECT pid, owner, src_big, caption, created FROM photo where pid IN(SELECT attachment.media.photo.pid FROM stream WHERE filter_key='app_2305272732' AND source_id IN(SELECT uid1 FROM friend WHERE uid2=me()) AND created_time<=now() ORDER BY created_time DESC LIMIT 200)
如果你进行这个查询,可以减少LIMIT参数,比方说LIMIT 50,这样你的单个查询可以更快,避免超时请求失败(如果照片数据太多太重),这取决于你的决定
我必须提醒您,您不能简单地使用照片表中的创建来查询流表的下一页,因为Feed可能包含很多照片并且已创建每张照片的时间可以更加不同(不同的时间可以是几小时!)。因此,如果要执行下一页,则应考虑执行多查询以检索流表的 created_time ,例如:
{"query1":"SELECT attachment.media.photo.pid, created_time FROM stream WHERE filter_key='app_2305272732' AND source_id IN(SELECT uid1 FROM friend WHERE uid2=me()) AND created_time<=now() ORDER BY created_time DESC LIMIT 200", "query2":"SELECT pid, owner, src_big, caption, created FROM photo where pid IN(SELECT attachment.media.photo.pid FROM #query1)"}
另外,请注意 ORDER BY创建的DESC 是对Feed进行排序,而不是照片,因此如果您看到创建时间不在订单中则是正常的。
您可以考虑使用下一页的 created_time 对每张照片的创建时间进行比较,并仅显示当前早于下一页 created_time的照片即可。例如,如果下一页 created_time 是下午5点,并且您在下午2点拥有已创建时间的照片A(从第一页获取)。您可以按住照片A,直到下一页 created_time 早于2.00 PM,这样您就可以向用户显示照片A.当然,在将照片A插入当前页面的照片后,您必须进行排序。