1 つの SQL クエリだけで実行しようとしているかなり複雑な操作がありますが、これが n 個のクエリに分割するよりも多かれ少なかれ最適かどうかはわかりません。基本的に、ユーザーIDとそれに関連付けられたfb_idでいっぱいの「Users」というテーブルがあります(idはpkで、fb_idはnullにすることができます)。
+-----------------+
| id | .. | fb_id |
|====|====|=======|
| 0 | .. | 12345 |
| 1 | .. | 31415 |
| .. | .. | .. |
+-----------------+
また、2 人のユーザー間の友人関係を表す「Friends」という別のテーブルもあります。これは (fb_id ではなく) ID を使用し、双方向の関係である必要があります。
+----------------+
| id | friend_id |
|====|===========|
| 0 | 1 |
| 1 | 0 |
| .. | .. |
+----------------+
// user 0 and user 1 are friends
問題は次のとおりです。 特定のユーザーの ID ("my_id") と、そのユーザーの Facebook の友達の配列 (fb_array と呼ばれる fb_id の配列) が与えられます。Friends テーブルを更新して、Facebook の友情をユーザー間の有効な友情として尊重するようにします。すべての Facebook 友達がデータベースにアカウントを持っているわけではないので、それらの友達は無視する必要があることに注意してください。このクエリは、ユーザーがログインするたびに呼び出されるため、ユーザーが Facebook で新しい友達を追加した場合にデータを更新できます。私が書いたクエリは次のとおりです。
INSERT INTO Friends (id, friend_id)
SELECT "my_id", id FROM Users WHERE id IN
(SELECT id FROM Users WHERE fb_id IN fb_array)
AND id NOT IN
(SELECT friend_id FROM Friends WHERE id = "my_id")
最初の IN 句のポイントは、Facebook の友達でもあるすべてのユーザーのサブセットを取得することです。これが私が心配している主要部分です。fb_id は配列として与えられるため、すべての ID を解析して、"fb_array" を構成するコンマで区切られた 1 つの巨大な文字列にする必要があります。その IN 句にこれほど巨大な文字列を使用することの効率が心配です (ユーザーは Facebook に何百、何千もの友達を持っている可能性があります)。このようなクエリを作成するためのより良い方法を考えられますか?
また、このクエリは友人関係の二重の性質を維持していないことにも注意してください。