FQL很难。确保它返回所有可能的结果是我能想到的最神秘的练习之一。请考虑这些查询,这些查询仅因限制和偏移而不同,并且返回结果:
SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me())
AND 0 < created AND created < 1299952078 LIMIT 400 OFFSET 0
返回400个结果。好的,很酷。
SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me())
AND 0 < created AND created < 1299952078 LIMIT 400 OFFSET 400
返回0结果。嗯,也许我只有400张照片。让我们确认一下:
SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me())
AND 0 < created AND created < 1299952078 LIMIT 500 OFFSET 0
返回357个结果。笏。其他43个结果去哪儿了?让我降低限制并翻页:
SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me())
AND 0 < created AND created < 1299952078 LIMIT 300 OFFSET 300
返回0结果???哦来吧。
任何人都可以解释一下吗?我把头发拉了出来。
答案 0 :(得分:4)
进一步评论@ user15来源:https://developers.facebook.com/blog/post/478/
<强>解释强>
特别适用于您的示例:
SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me())
AND 0 < created AND created < 1299952078 LIMIT 400 OFFSET 0
Returns 400 results. Okay, cool.
这意味着在某些脱节数据(图片中的#3)中,您可以获得400个总结果。
SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me())
AND 0 < created AND created < 1299952078 LIMIT 400 OFFSET 400
Returns 0 results
这来自他们的文字:
这也意味着当您手动构建自己的查询时, 你应该知道,如果你有一些表和连接 指定“offset”参数,指向您的第N个结果 可能不会在您的结果中返回(如第2步中的第3个结果) 上面的图片。)
一个棘手的问题是确定你是否已经到了最后 结果集。例如,如果您指定的限制为“5”,则为5 收到的帖子对观众不可见,你会得到一个空的 结果集。
因此,看起来有限制你会得到图中的#3,但是当使用偏移它时,你最终会得到类似#2的东西;这意味着您的偏移可能会将您置于#2的红色区域之一,这意味着该帖子对用户不可见,并且不会出现在您的数据集中(0返回结果)。
SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me())
AND 0 < created AND created < 1299952078 LIMIT 500 OFFSET 0
Returns 357 results
从他们的文字:
查询参数应用于我们的结尾之前检查以查看是否 返回的结果对查看者可见。因此,它是 可能会得到比预期更少的结果。
SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me())
AND 0 < created AND created < 1299952078 LIMIT 300 OFFSET 300
Returns 0 results
查看我对第二个查询的回答
<强>解决方案:强>
根据我对如何简化原始查询的问题的评论:
SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me())
AND created < 1299952078 LIMIT 400;
此查询表示检查所有相册中的所有照片,其中创建日期在某个时间之前(时间戳)。这是对的吗?
我可以看到你做的两种可能的解决方案:
检查这些照片的权限限制 您可能需要从结果集中删除 修改您的查询以包含以下内容:
来自:https://developers.facebook.com/docs/reference/fql/photo
权限
阅读您需要的照片表
- 任何有效的access_token,如果它是公共的并且由Page拥有。
- user_photos访问用户上传的照片和相册的权限,以及用户已被标记的照片。
- friends_photos访问朋友的照片和照片的权限,其中用户的朋友已被标记。
我认为这是最适合你的。你可能需要 选择一个足够低的限制,如20或50,并调整 查询周围的时间戳,例如:
一个:
SELECT标题FROM photo WHERE help IN(SELECT aid FROM album WHERE owner = me())AND&lt; 1299952078 LIMIT 20;
下一步:
SELECT标题FROM photo WHERE help IN(SELECT aid FROM album WHERE owner = me())AND&lt; 1298123456 LIMIT 20;
如果其中任何一项适合您,请告诉我。请注意我编写了第二个时间戳,你必须弄明白。
答案 1 :(得分:1)
FQL查询将仅返回您可以看到的结果以及您提出的权限。因此,可以获得比您指定的LIMIT更少的结果。
如果您使用
... LIMIT 400 OFFSET 0
您在索引0到400 之间得到前400个结果。但是如果你使用
... LIMIT 400 OFFSET 400
你要求结果在0到400之间,偏移量为400 ,这将始终返回0结果。如果您想要下400个结果,则应使用
... LIMIT 400,800