python - 如何执行多查询 fql 语句?

标签 python sql facebook json facebook-fql

通过下面的 FQL 查询,我可以获得新闻源上包含“www.youtube.com”的帖子的 actor_id 和附件数据。但是,我还希望能够获取该用户的照片和姓名。我如何将其合并到下面的查询中?

SELECT created_time, post_id, actor_id, type, updated_time, attachment
FROM stream 
WHERE post_id IN 
   (SELECT post_id
    FROM stream
    WHERE ('video') IN attachment 
    AND source_id IN
       (SELECT uid2
        FROM friend
        WHERE uid1=me())
    LIMIT 100)

编辑:

    #right fql query, but prints only part of it
    posts_query = "SELECT created_time, post_id, actor_id, type, updated_time, attachment FROM stream WHERE post_id in (select post_id from stream where ('video') in attachment AND source_id IN ( SELECT uid2 FROM friend WHERE uid1=me()) limit 100)"
    fql_var = "https://api.facebook.com/method/fql.query?access_token=" + token['access_token'] + "&query=" + posts_query + "&format=json"
    data = urllib.urlopen(fql_var)
    fb_stream = json.loads(data.read())
    #print ast.literal_eval(json.dumps(fb_stream))

    users_query = "SELECT uid, first_name FROM user WHERE uid IN (SELECT actor_id FROM (" + posts_query+"))"
    fqlquery_user = "https://api.facebook.com/method/fql.query?access_token=" + token['access_token'] + "&query=" + users_query + "&format=json"
    user_data2 = urllib.urlopen(fqlquery_user)
    user_stream2 = json.loads(user_data2.read())
    print ast.literal_eval(json.dumps(user_stream2))

最佳答案

似乎您无法仅使用一个查询来完成此操作,因为:

  1. 在 FQL 中,您一次只能从一个表中SELECT
  2. FQL 中没有 JOIN。 (参见this questionthat one)

如果可以的话,它会是这样的:

SELECT created_time, post_id, actor_id, type, updated_time, attachment, user.first_name
FROM stream
WHERE ('video') in attachment AND 
        source_id IN (SELECT uid2 FROM friend WHERE uid1=me())
LEFT JOIN user ON user.uid=actor_id
LIMIT 100

但是没有连接,因此您需要使用 Facebook 所谓的 multiquery ,您将有两个查询:

posts_query =
SELECT created_time, post_id, actor_id, type, updated_time, attachment
FROM stream
WHERE ('video') in attachment AND 
        source_id IN (SELECT uid2 FROM friend WHERE uid1=me())
LIMIT 100

users_query =
SELECT uid, first_name
FROM user
WHERE uid IN (SELECT actor_id FROM #posts_query)

这里是 Explorer 的链接供您测试。

注意:您在原始查询中做了一些无用的事情,即从表中进行选择,并在同一个表的 where 子句中添加子查询。所以这是多余的。

更新:

#right fql query, but prints only part of it
posts_query = "SELECT created_time, post_id, actor_id, type, updated_time, attachment FROM stream WHERE post_id in (select post_id from stream where ('video') in attachment AND source_id IN ( SELECT uid2 FROM friend WHERE uid1=me()) limit 100)"
users_query = "SELECT uid, first_name FROM user WHERE uid IN (SELECT actor_id FROM (#posts_query))"

queries = {'posts_query': posts_query, 'users_query': users_query}
fql_var = "https://api.facebook.com/method/fql.query?access_token=" + token['access_token'] + "&q=" + json.dumps(queries_json) + "&format=json"
data = urllib.urlopen(fql_var)
fb_stream = json.loads(data.read())
print ast.literal_eval(json.dumps(fb_stream))

我们的想法是发送两个查询,并将其名称作为键,并以 JSON 进行编码,以便 Facebook 知道 #posts_query 是您在同一 API 请求中发送的查询。您发送的名称与在 JSON 编码对象中发送的名称完全相同,而不是用查询本身替换它。查看有关多重查询的文档以获取详细信息和示例。

关于python - 如何执行多查询 fql 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13655106/

相关文章:

facebook - FB.Event.subscribe未注册状态:true in Internet Explorer and Firefox

Android Facebook SDK - 无法接收访问 token

python - 值错误 : tile cannot extend outside image

python - 如何删除开头为的 S3 文件

php - sql - 在没有额外查询的情况下更新时检查行是否存在?

javascript - 使用 Graph API 获取视频源 URL Facebook

python - Pandas 寻找多个层次结构的平均值

python - 查找字典 Python 列表的差异

sql - 在单个 SQL 查询中,查询可以从单个表中使用多少个索引?

sql - 值可以是主键和外键吗?