正如标题所说,我正在尝试获取最多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不是我最大的力量,我真的希望我错过了什么......
一定有更好的方法!任何人吗?
答案 0 :(得分: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的某些机制。
另一个选项(可能需要对应用程序流程进行一些更改)不是选择所有用户朋友,而是显示用户朋友列表,让他们决定要扫描哪些朋友以获取相互照片。这也可能允许您限制实际查询量。
答案 1 :(得分: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'])
照片会给每个键都有一个dict列表作为值。
只需要将其中的10个提供给photo
表FQL调用
在使用facepy
模块的Python中,它可能看起来像
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())