0

这可能吗?我尝试了一件不起作用的事情:

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()
        )
    )
)

我是否需要获取用户喜欢的页面,然后遍历所有页面,检查朋友的喜欢?

4

5 回答 5

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())

希望它会与你一起工作,,,

于 2013-05-08T21:35:22.600 回答
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_ids 列表中获取朋友的喜欢,但是由于某种原因,这总是返回一个空集。似乎这可以在 1 个查询中工作,你必须走很长的路。

于 2013-05-04T19:56:11.397 回答
1

对于任何大于 2 的子查询,FQL 会变成蜗牛或超时。此外,我什至不确定是否选择了不同的 page_ids(每个用户都喜欢同一个页面,它是如何过滤的?)。因此,当您进行设置操作时,它很可能不起作用。只需执行两个查询。

  • 一个得到朋友喜欢的 page_ids 列表的人 "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 的浏览器转储来确认。由于禁用 3rd 方应用程序的朋友的 API 隐私限制,查看实际页面将不是有效测试。我们希望匹配 JSON 响应中的出现。

于 2013-05-04T23:37:30.913 回答
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"])

因此,您必须先过滤页面,然后再检查朋友是否喜欢该页面,除非您想等待很长时间。

于 2013-05-10T16:08:43.367 回答
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"
于 2013-05-14T06:35:51.670 回答