2

正如标题所说,我正在尝试获取最多 10 张照片,其中标记了当前登录的用户和他/她的一个或多个朋友。目前我正在尝试使用 PHP API 和 FQL 来做到这一点。

我是 FQL 的新手,但对编程等并不陌生。我目前能够实现我想要的唯一方法是动态构建多个查询,如下所示:

SELECT pid, src_big FROM photo WHERE pid IN(  
  SELECT pid FROM photo_tag WHERE subject = me() 
) AND pid IN( 
  SELECT pid FROM photo_tag WHERE 
    subject = '1530195' OR 
    subject = '3612831' OR 
    subject = '6912041' OR 
    ...
)

除了丑陋之外,这很慢。查询被限制在上面显示的长度,因为当它们变得更长时它们会失败。

多查询对我没有帮助,因为我不能使用“as”,但 SQL 不是我最大的优势,我真的希望我错过了一些东西。

一定会有更好的办法!任何人?

4

2 回答 2

0

不确定这会在多大程度上提高性能。但至少,它可能会使您的查询更具可读性:

您可以使用熟悉的WHERE IN (...)语句代替您OR xxx OR yyy的用户 ID 列表格式...

SELECT pid, src_big FROM photo WHERE pid IN( 
  SELECT pid FROM photo_tag WHERE subject = me() 
) AND pid IN(
  SELECT pid FROM photo_tag WHERE subject IN(
    '1530195', 
    '3612831',
    '36800240',
    ...
  )

由于多种原因,涉及整个用户朋友列表的此类查询往往会出现问题。首先,可能有数百个朋友,因此即使您设法提高一个查询的性能,您也必须执行一系列查询来遍历用户的整个朋友列表。其次,在 API 上一个接一个地运行这些类型的密集查询可能会触发您的应用程序的一些限制......

我唯一可以建议您的是让您的用户知道您正在执行密集操作并且“可能需要一点时间”:P 在您必须执行查询的场景之后,甚至可能会限制每个查询都不会触发 Facebook 方面的某些机制,这些机制可能会限制您对 API 的访问。

另一个选项(可能需要对您的应用程序流程进行一些更改)不是选择所有用户朋友,而是显示用户朋友列表并让他们决定要扫描哪些朋友以获取共同照片。这也可能允许您限制查询的实际数量。

于 2013-05-04T22:21:52.317 回答
0

只需使用两个查询并用您选择的编程语言进行交集。

  • SELECT subject, pid FROM photo_tag WHERE subject = me()
  • SELECT pid, subject FROM photo_tag WHERE subject IN (SELECT uid2 FROM friend WHERE uid1=me())

批处理这两个调用

fql?q={"userphotos":"SELECT subject, pid 
                     FROM photo_tag 
                     WHERE subject = me()",
       "friendphotos":"SELECT pid, subject 
                       FROM photo_tag 
                       WHERE subject IN 
                      (SELECT uid2 FROM friend WHERE uid1=me())"}

然后在你的编程语言中做这两组的交集。

a0 = data['data'][0]['fql_result_set'] a1 = data['data'][1]['fql_result_set']

例如在 Python 中,一些简单的东西

>>> photos = {}
>>> for p in a0:
...     for q in a1:
...         if p['pid'] == q['pid']:
...             pid =  p['pid']
...             if pid in photos:
...                 photos[pid].append(p['subject'])
...             else:
...                 photos[pid] = [q['subject']]
...                 photos[pid].append(p['subject'])

照片将给出一个字典,每个键都有一个 id 列表作为值。只需取其中的 10 个并将其提供给photo表 FQL 调用

在带有模块的 Python 中,facepy它可能看起来像

photoquery = 'SELECT pid, src_big FROM photo WHERE '+
             'pid ='+pid1+' OR
             'pid ='+pid2+' OR
              ...

graph.fql(photoquery)

总体上最慢的部分将是对朋友的 photo_tag 查询。 SELECT pid, subject FROM photo_tag WHERE subject IN (SELECT uid2 FROM friend WHERE uid1=me())

于 2013-05-05T12:57:05.287 回答