2

タイトルが示すように、現在ログインしているユーザーとその友人の 1 人以上がタグ付けされている最大 10 枚の写真を取得しようとしています。現在、PHP API と FQL を使用してこれを実行しようとしています。

私はFQLは初めてですが、プログラミングなどは初めてではありません。現在、私が望むものを達成できる唯一の方法は、次のような複数のクエリを動的に構築することです。

SELECT pid, src_big FROM photo WHERE pid IN(  
  SELECT pid FROM photo_tag WHERE subject = me() 
) AND pid IN( 
  SELECT pid FROM photo_tag WHERE 
    subject = '1530195' OR 
    subject = '3612831' OR 
    subject = '6912041' OR 
    ...
)

醜いだけでなく、これは遅いです。クエリは、これより長くなると失敗するため、上記の長さに制限されます。

「as」を使用できないため、マルチクエリは役に立ちませんでしたが、SQL は私の最大の強みではありません。

もっと良い方法があるはずです!誰?

4

2 に答える 2

0

これによりパフォーマンスがどの程度向上するかはわかりません..しかし、少なくとも、クエリが読みやすくなる可能性があります。

ユーザー ID のリストの形式の代わりに、おなじみのWHERE IN (...)ステートメントを使用できます...OR xxx OR yyy

SELECT pid, src_big FROM photo WHERE pid IN( 
  SELECT pid FROM photo_tag WHERE subject = me() 
) AND pid IN(
  SELECT pid FROM photo_tag WHERE subject IN(
    '1530195', 
    '3612831',
    '36800240',
    ...
  )

ユーザーの友人のリスト全体を含むこの種のクエリは、さまざまな理由で問題になる傾向があります。まず、何百人もの友達がいる可能性があるため、1 つのクエリのパフォーマンスを高速化できたとしても、一連のクエリを実行して、ユーザーの友達リスト全体を反復処理する必要があります。第二に、この種の集中的なクエリを API で次々に実行すると、アプリケーションのスロットリングが発生する可能性があります...

私があなたに提案できる唯一のことは、あなたが集中的な操作を実行していて、「少し時間がかかるかもしれない」ことをユーザーに知らせることです. API へのアクセスを制限する可能性のある Facebook 側のメカニズムをトリガーしないように、各クエリを使用してください。

別のオプション (アプリケーション フローを少し変更する必要があるかもしれません) は、すべてのユーザーの友達を選択する代わりに、ユーザーの友達のリストを表示し、相互の写真をスキャンする友達を決定できるようにすることです。これにより、クエリの実際の量を制限することもできます。

于 2013-05-04T22:21:52.317 に答える