1

Facebookの友達のユーザーの画像を使った商品を作っています。SOで、アルバムとユーザーの友達リストを次のようにフィルタリングして写真をフィルタリングする例を複数見つけました。

SELECT pid, link, owner
FROM photo
WHERE aid IN 
  (SELECT aid FROM album WHERE owner IN 
    (SELECT uid2 FROM friend WHERE uid1=me()) 
  )

しかし、なぜアルバムコレクションをスキップできないのですか?以下は機能するはずですが、Graph API Explorerで実行しても、結果が返されることはありません(タイムアウトが発生しないなど)。

SELECT pid, link, owner
FROM photo
WHERE owner IN (SELECT uid2 FROM friend WHERE uid1=me())
AND created > strtotime("10 February 2013")
ORDER BY created DESC

私が使用しているトークンには、間違いなく「user_photos」と「friends_photos」があります。通常のグラフエクスプローラーを使用しても同じ動作があり、結果は表示されません。

ここに画像の説明を入力してください

これは私のロジックのエラーですか、Facebookプラットフォームのエラーですか、それともここで何か奇妙なことが起こっていますか?

4

1 に答える 1

1

について話す:

SELECT pid, link, owner
FROM photo
WHERE owner IN (SELECT uid2 FROM friend WHERE uid1=me())
AND created > strtotime("10 February 2013")
ORDER BY created DESC
  • まず、このクエリがタイムアウトします。
  • 次に、FQL クエリでは 5000 件の結果しか得られませんが、友人はそれよりもはるかに多くの写真をアップロードしています。
  • 3 番目に、最初のクエリを改善しようとしましたが、うまくいきませんでした (私の場合、1470 枚の友人の写真しか見つかりませんでした)。
  • 第 4 に、2 番目のクエリがタイムアウトせず、5000 を超える結果が得られたとしても、このクエリではユーザーの友人のすべての写真が得られるわけではありません。このクエリの理由:

    SELECT pid, link, owner FROM photo WHERE owner=USER_ID たとえば、ユーザーは 2000 枚の写真を持つことができますが、ユーザーの最後の 100 枚の写真のみを提供します。

したがって、少なくとも、クエリを修正する必要はありませんが、新しいクエリを作成する必要があります。目標は、複雑なクエリを作成しながらできるだけ少ないクエリを作成することではなく、機能するものを明確にすることです。

最初に、1 人のユーザーのすべての写真を取得してみましょう。

SELECT pid, link, owner
FROM photo
WHERE owner=USER_ID
AND created > strtotime("10 February 2013")
ORDER BY created DESC
LIMIT 5000 OFFSET 0

今では 100 枚ではなく 5000 枚です。

次に、すべてのフレンド ユーザーを取得します。

SELECT uid2 FROM friend WHERE uid1=me() LIMIT 5000

ユーザーの友達の最大数は実際には 5000 人です。

今、あなたがしなければならないことは次のとおりです。

  1. ユーザーのフレンドリストを取得する 1 つのリクエストを作成します。
  2. 各友人にループし、写真を取得するために各友人に 1 つの要求を行います。写真の数が 5000 枚以上の場合は、表示する写真がまだ残っていることを意味します。次に、を 5000ずつ増やしながら、別のリクエストを行う必要があります。OFFSET

これで、すべてのユーザーの友達の写真を確実に取得できます! また、この手順を複数の小さなリクエストに分割することは悪いことではありません。たとえば、AJAX で進行状況バーとしてレンダリングできるクエリの進行状況を知ることができます。結構時間かかるからいいかも!

于 2013-03-10T14:13:22.953 に答える