2012-12-01 90 views
1

從下面的FQL查詢中,我可以獲取新聞傳播中包含「www.youtube.com」的帖子的actor_id和附件數據。但是,我希望能夠獲取該用戶的圖片和名稱。我將如何將它納入下面的查詢?如何執行multiquery fql語句?

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

好像你不能只用一個查詢做到這一點,是因爲:

  1. 您只能SELECT從一個表FQL一次。
  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編碼對象的方式發送,而不是由查詢本身替換。有關詳細信息和示例,請查看multiquery上的文檔。

+0

謝謝,這是有道理的。我將如何將其納入python?我試過以上(在編輯中),但似乎沒有工作。 – sharataka

+0

要使用這些,你需要一次發送它們,即一個'urllib'請求,因爲它們相互依賴。我會更新我的答案,告訴你如何。 – jadkik94

1

您需要使用FQL Multiquery,這樣你就會有兩個疑問 - 你自己去取「上崗」,另一個獲取「演員」。這些查詢一起執行,您必須調整您的代碼以將使用actor_id的值返回的兩個數組進行配對。

"posts":"your_query_here" 
"actors":"SELECT name,pic_square FROM user WHERE uid IN (SELECT actor_id FROM #posts)" 

You can see the results of this query here

+0

謝謝,這是有道理的。我將如何將其納入python?我試過以上(在編輯中),但似乎沒有工作。 – sharataka

+0

無法幫助你,因爲我不熟悉Python中的編碼。 – Justus