正如标题所说,我试图获取最多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不是我最大的优势,我真的希望我错过了一些东西。
一定有更好的办法!有人知道吗?
只需使用两个查询并使用您选择的编程语言进行交集。
-
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'])
photos将给出一个字典,每个键都有一个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())
不确定这会提高多少性能。但至少,它可以使您的查询更具可读性:
对于用户id列表,您可以使用熟悉的WHERE IN (...)
语句而不是OR xxx OR yyy
格式…
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。
另一个选项(可能需要对你的应用程序流程做一点改变)是,不是选择所有用户的朋友,而是显示一个用户朋友的列表,让他们决定他们想要扫描哪些朋友的共同照片。这可能还允许您限制查询的实际数量。