1

我正在构建一个产品,它使用来自用户 Facebook 朋友的图像。我在 SO 上找到了多个示例,它们通过像这样过滤相册和用户朋友列表来过滤照片:

SELECT pid, link, owner
FROM photo
WHERE aid IN 
  (SELECT aid FROM album WHERE owner IN 
    (SELECT uid2 FROM friend WHERE uid1=me()) 
  )

但是为什么我不能跳过专辑收藏呢?以下应该可以工作,但在Graph API Explorer中运行它永远不会返回结果(比如永远不会发生的超时):

SELECT pid, link, owner
FROM photo
WHERE owner IN (SELECT uid2 FROM friend WHERE uid1=me())
AND created > strtotime("10 February 2013")
ORDER BY created DESC

我最常用的令牌肯定有“user_photos”和“friends_photos”。使用常规图形浏览器也有相同的行为,没有显示任何结果:

在此处输入图像描述

这是我的逻辑错误,Facebook平台的错误,还是这里发生了什么奇怪的事情?

4

1 回答 1

1

谈到:

SELECT pid, link, owner
FROM photo
WHERE owner IN (SELECT uid2 FROM friend WHERE uid1=me())
AND created > strtotime("10 February 2013")
ORDER BY created DESC
  • 首先,此查询超时。
  • 其次,FQL 查询只能给出 5000 个结果,而我们的朋友上传的照片远不止这些。
  • 第三,您尝试改进第一个不起作用的查询(在我的情况下,它只找到了我朋友的 1470 张照片)。
  • 第四,即使你的第二个查询不会超时,如果它可以给出超过 5000 个结果,这个查询也不会给出用户朋友的所有照片。因为这个查询:

    SELECT pid, link, owner FROM photo WHERE owner=USER_ID 只给出用户的最后 100 张照片,而用户可以有 2000 张照片。

因此,至少,我们不必更正您的查询,但我们应该尝试创建一个新查询。目标不是在进行复杂查询时尽可能减少查询,而是要明确一些可行的方法。

首先,让我们尝试获取一个用户的所有照片。

SELECT pid, link, owner
FROM photo
WHERE owner=USER_ID
AND created > strtotime("10 February 2013")
ORDER BY created DESC
LIMIT 5000 OFFSET 0

现在我们不再获得 100 张照片,而是 5000 张!

其次,我们得到所有的朋友用户:

SELECT uid2 FROM friend WHERE uid1=me() LIMIT 5000

一个用户的最大好友数确实是 5000。

现在,您所要做的就是:

  1. 发出一个获取用户好友列表的请求。
  2. 循环访问每个朋友并为他们每个人发出一个请求以检索他们的照片。如果照片数量不少于 5000 张,则表示用户还有一些照片要展示。然后,您必须在增加5000时发出另一个请求!OFFSET

现在你一定会得到所有用户朋友的照片!此外,将这个过程分成多个较小的请求也不是一件坏事。您将能够知道查询的进度,例如,您可以在 AJAX 中将其呈现为进度条。这可能是一件好事,因为这将花费很多时间!

于 2013-03-10T14:13:22.953 回答