1

以下の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))
4

2 に答える 2

1

FQL Multiqueryを使用して、2つのクエリ(「投稿」をフェッチするためのクエリと「アクター」をフェッチするためのクエリ)を作成する必要があります。クエリは一緒に実行され、actor_idの値を使用して返される2つの配列をペアにするようにコードを調整する必要があります。

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

このクエリの結果はここで確認できます

于 2012-12-06T08:48:52.530 に答える
1

次の理由から、1つのクエリだけでは実行できないようです。

  1. SELECTFQLでは一度に1つのテーブルからしか実行できません。
  2. FQLにはJOINはありません。(この質問その質問を参照してください)

可能であれば、次のようになります。

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がマルチクエリと呼ぶものを使用する必要があり、2つのクエリがあります。

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)

これは、エクスプローラーをテストするためのリンクです。

:元のクエリで行っている役に立たないことがあります。それは、テーブルから選択し、同じテーブルの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エンコードされたオブジェクトで送信するのとまったく同じように送信します。詳細と例については、マルチクエリに関するドキュメントを確認してください。

于 2012-12-06T08:52:23.600 に答える