【问题标题】:FQL: Limit and Offset variance return unexpected resultsFQL:限制和偏移方差返回意外结果
【发布时间】:2013-12-23 00:04:20
【问题描述】:

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

谁能解释一下?我正在拔头发。

【问题讨论】:

  • 我想我看到了一些问题。 FQL 和 YQL 是 SQL 的变体,通常具有相同的语法。在您的示例中,您不需要创建 0 LIMIT 0, 400 (this can be simplified to LIMIT 400) LIMIT 400, 400 LIMIT 0, 500 (or LIMIT 500) LIMIT 300,300 此外,如果您真的想简化查询,请执行 created BETWEEN 0 AND 1299952078 但如上所述创建
  • 你能否验证内容没有改变(查询之间没有删除)?可能不是,而是一个询问更多信息的问题。
  • 谢谢@shawn,我不知道那个限制语法。但是,使用您的建议,结果与以前完全相同。
  • Facebook 开发人员对 FQL 中的 offset 有很多问题,因此他们建议使用 the “since” and “until” parameters 进行类似 photos 的查询。见developers.facebook.com/blog/post/478
  • @user15 since 和 until 不是照片表的成员。这不是图形 API 问题,这是一个 FQL 问题。

标签: pagination facebook-fql limit offset


【解决方案1】:

进一步评论@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

这来自他们的文字:

这也意味着当您手动构建自己的查询时, 你应该知道,如果你有一些表和连接 指定“偏移”参数,您指向的第 N 个结果 可能不会在您的结果中返回(如第 2 步中的第 3 个结果) 上图)。

一个棘手的问题是确定您是否已到达终点 结果集。例如,如果您指定了“5”的限制,但 5 返回的帖子对查看者不可见,您将得到一个空的 结果集。

因此,使用 limit 时,您将在图中得到 #3,但是当使用 offset 时,您可能会得到类似 #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,如果它是公共的并且归主页所有。
    • user_photos 访问用户上传的照片和相册的权限,以及用户被标记的照片。
    • friends_photos 权限,可访问朋友的照片和已标记用户朋友的照片。
  2. 这是我认为最适合您的方法。你可能需要 选择一个足够低的限制,如 20 或 50,然后调整 查询周围的时间戳,例如:

    上一个:

    SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me()) AND created

    下一步:

    SELECT caption FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner = me()) AND created

让我知道这些是否适合您。请注意,我编了第二个时间戳,你必须弄清楚。

【讨论】:

  • 感谢您的详细回答。这实际上就是我最初陷入这种情况的方式。我的最终目标是为用户获取所有照片。我正在查询的用户拥有超过 5000 张照片,因此任何对 FQL 的单个查询都将受到该数字的限制,无论如何。我实际上是从created &lt; 1386367906(之前)开始的,只要我的偏移量小于 5000,每页总是完全我指定的限制量。根据您的建议,我的问题中的查询源自创建的最小字段并重新开始。
  • 那么另一种方法可能是使用图形 api 调用来代替?看起来它在内部知道如何根据您需要的限制来处理上一个和下一个调用。你有这种可能吗?
【解决方案2】:

FQL 查询将仅返回对您可见的结果,以及您已请求的权限。因此,可能会得到比您指定的 LIMIT 更少的结果。

如果你使用

... LIMIT 400 OFFSET 0

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

... LIMIT 400 OFFSET 400

您要求的结果介于 0 和 400 之间,偏移量为 400,这将始终返回 0 个结果。如果你想要接下来的 400 个结果,你应该使用

... LIMIT 400,800

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多