0

これは可能ですか?うまくいかないことを1つ試しました:

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

FQL は、2 つを超えるサブクエリのカタツムリまたはタイムアウトになります。また、個別の page_id が選択されているかどうかもわかりません (各ユーザーは同じページをどのようにフィルタリングするのが好きですか?)。そのため、set 操作を実行すると、ほとんどの場合、機能しません。2 つのクエリを実行するだけです。

  • 友達のように 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

ここで 2 つのことを行う必要があります。

  • 交差セットを取得する
  • 重複を削除

これは、フィルターとラムダの観点から、このレベルでは些細なことになります....しかし、データの有用性はほとんど破壊されます。実際に好きだった実際の友達を除いた一連のページがあります。どのように確認しますか?

さて、考えてみると、ユーザー ID フィールドを API 呼び出しから保持するのが最善であり、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 応答の出現箇所を一致させたいと考えています。

于 2013-05-04T23:37:30.913 に答える
0

私のpythonコードはクエリに約36.8938140869秒を費やしています.2277人の友達と2086ページが好きです(Facebookには友達とページの接続に5000の制限があります). 100 page_ids を 1 回クエリしても問題ないと思います。

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 に答える