FQL:限制和偏移方差返回意外结果

时间:2013-12-05 20:45:42

标签: pagination facebook-fql limit offset

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结果???哦来吧。

任何人都可以解释一下吗?我把头发拉了出来。

2 个答案:

答案 0 :(得分:4)

进一步评论@ user15来源:https://developers.facebook.com/blog/post/478/

enter image description here

<强>解释

特别适用于您的示例:

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;

此查询表示检查所有相册中的所有照片,其中创建日期在某个时间之前(时间戳)。这是对的吗?

我可以看到你做的两种可能的解决方案:

  1. 检查这些照片的权限限制 您可能需要从结果集中删除 修改您的查询以包含以下内容:

    来自:https://developers.facebook.com/docs/reference/fql/photo

      

    权限

         

    阅读您需要的照片表

         
        
    • 任何有效的access_token,如果它是公共的并且由Page拥有。
    •   
    • user_photos访问用户上传的照片和相册的权限,以及用户已被标记的照片。
    •   
    • friends_photos访问朋友的照片和照片的权限,其中用户的朋友已被标记。
    •   
  2. 我认为这是最适合你的。你可能需要 选择一个足够低的限制,如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;

  3. 如果其中任何一项适合您,请告诉我。请注意我编写了第二个时间戳,你必须弄明白。

答案 1 :(得分:1)

FQL查询将仅返回您可以看到的结果以及您提出的权限。因此,可以获得比您指定的LIMIT更少的结果。

如果您使用

... LIMIT 400 OFFSET 0

您在索引0到400 之间得到前400个结果。但是如果你使用

... LIMIT 400 OFFSET 400

你要求结果在0到400之间,偏移量为400 ,这将始终返回0结果。如果您想要下400个结果,则应使用

... LIMIT 400,800