这可能吗?我尝试了一件不起作用的事情:
SELECT name
FROM page
WHERE page_id IN (
SELECT page_id
FROM page_fan
WHERE uid = me()
AND page_id IN (
SELECT page_id
FROM page_fan
WHERE uid IN (
SELECT uid2
FROM friend
WHERE uid1 = me()
)
)
)
我是否需要获取用户喜欢的页面,然后遍历所有页面,检查朋友喜欢?
答案 0 :(得分:2)
这个FQL可以解决这个问题:
select name from page where page_id in (SELECT page_id FROM page_fan WHERE uid IN
(SELECT uid2 FROM friend WHERE uid1 = me ())) and page_id in
(select page_id from page_fan where uid = me())
希望它能与你合作,,,
答案 1 :(得分:1)
使用多查询我能够使用以下查询实现此目的。但是确实需要一些时间。
{"friend_likes":"SELECT page_id FROM page_fan WHERE uid in(SELECT uid2 FROM friend WHERE uid1= me())","joints":"SELECT name FROM page WHERE page_id in(SELECT page_id FROM page_fan WHERE uid = me() AND page_id in(SELECT page_id FROM #friend_likes))"}
上述查询可让您的所有朋友喜欢,然后根据您的喜好进行匹配。问题是,你拥有的朋友越多,运行的时间越长(因为它明显得到了他们所有的喜欢)。我尝试通过获取所有喜欢来优化这一点,然后只从page_id列表中获得朋友喜欢,但是由于某种原因,这总是返回一个空集。看起来这个在1个查询中工作,你必须像现在这样长篇大论。
答案 2 :(得分:1)
对于任何大于2的子查询,FQL会变成蜗牛或超时。此外,我甚至不确定选择了不同的page_ids(每个用户都喜欢同一页面如何过滤?)。因此,当您执行set操作时,它很可能无法正常工作。只做两个查询。
"SELECT page_id FROM page_fan WHERE uid IN (SELECT uid2 FROM friend WHERE uid1=me())"
"SELECT page_id FROM page_fan WHERE uid=me())"
现在把它放在一个批次中,这样我们就可以同时获得两个数据集
fql?q={"userpages":"SELECT page_id
FROM page_fan
WHERE uid=me()",
"friendpages":"SELECT page_id
FROM page_fan
WHERE uid IN
(SELECT uid2 FROM friend WHERE uid1=me())"}
从这里你很可能会有一个非常庞大的名单和一个小名单
让我们说在Python中,
>>> len(data['data'][0]['fql_result_set'])
4505
>>> len(data['data'][1]['fql_result_set'])
85
我们需要在这里做两件事,
现在,就过滤器和lambdas来说,这将在这个层面上变得微不足道......但是我们几乎破坏了数据的任何有用性。我们只有一组页面少了真正喜欢它们的实际朋友!我们如何验证?
好吧,现在考虑一下,最好保留API调用中的用户ID字段,然后我们就会将ID聚集在一起。 Python中的一个简单示例
>>> pages = {}
>>> for p in a0:
... for q in a1:
... if p['page_id'] == q['page_id']:
... pid = p['page_id']
... if pid in pages:
... pages[pid].append(p['uid'])
... else:
... pages[pid] = [q['uid']]
... pages[pid].append(p['uid'])
pages
会给我一个字典,每个键都有一个id列表作为值。
然后我们可以通过查看API调用和crtl-F的浏览器转储来确认。由于禁用第三方应用程序的朋友的API隐私限制,查看实际页面将不是有效测试。我们希望匹配JSON响应中的出现次数。
答案 3 :(得分:0)
感谢那些回答了这个问题的人。不幸的是,所有的解决方案都很慢,并且它们没有获得所有页面(我猜是因为超时)。
我所做的就是获取所有用户的页面。然后我将这些内容过滤到我感兴趣的页面。之后我会查看朋友是否喜欢这些页面:
likes = fql("SELECT name, page_id FROM page WHERE page_id IN (SELECT page_id FROM page_fan WHERE uid=me())", access_token);
pages = []
for x in xrange(len(likes)):
# Check that the page is an occasion
conn.execute("SELECT 1 FROM occasionPageIds WHERE pageid = " + str(likes[x]["page_id"]) + " LIMIT 1");
if len(conn.fetchall()):
# Check that friends like this
friend_likes = fql("SELECT uid FROM page_fan WHERE page_id = " + str(likes[x]["page_id"]) + " AND uid IN (SELECT uid2 FROM friend WHERE uid1=me())", access_token);
if len(friend_likes):
pages.append(likes[x]["page_id"])
所以你必须在检查朋友是否喜欢这个页面之前过滤页面,除非你想等很长时间。
答案 4 :(得分:0)
我的python代码花费大约36.8938140869秒查询,我有2277个朋友和2086页页面浏览(Facebook有5000个朋友限制+页面连接)。我认为查询100个page_ids一次应该没问题。
import urllib, urllib2, json, time
t0 = time.time()
a = "SELECT name, page_id FROM page WHERE page_id IN (SELECT page_id FROM page_fan WHERE uid = me())"
AC = "USER_ACCESS_TOKEN"
url = "https://graph.facebook.com/fql?q="+urllib.quote_plus(a)+"&format=json-strings&access_token="+AC
print url
o = urllib2.urlopen(url)
r = o.read()
j = json.loads(r)['data']
page_list = []
page_info_dict = {}
for jj in j:
page_list.append(jj["page_id"])
page_info_dict[jj["page_id"]] = jj["name"]
map_list =[]
st = 0
for i, e in enumerate(page_list):
t1 = time.time()
pp = ",".join(page_list[st:st+100])
print pp, type(pp)
a = "SELECT page_id FROM page_fan WHERE page_id IN ("+pp+") and uid IN (SELECT uid2 FROM friend WHERE uid1=me())"
url = "https://graph.facebook.com/fql?q="+urllib.quote_plus(a)+"&format=json-strings&access_token="+AC
print url
o = urllib2.urlopen(url)
r = o.read()
j = json.loads(r)
t2 = time.time()
print t2- t1
for jj in j['data']:
map_list.append(jj["page_id"])
if st>len(page_list):
break
else:
st+=100
mutual_liks_page_id = list(set(map_list))
for page_id in mutual_liks_page_id:
print page_info_dict.get(page_id, "")
print "Total time: ", time.time()-t0, " seconds"