1

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 に何百、何千もの友達を持っている可能性があります)。このようなクエリを作成するためのより良い方法を考えられますか?

また、このクエリは友人関係の二重の性質を維持していないことにも注意してください。

4

2 に答える 2

1

次の列が null 可能かどうかによって異なります (値は にすることができますNULL)。

  • USERS.id
  • FRIENDS.friend_id

Null可能:

SELECT DISTINCT
       "my_id", u.id 
  FROM Users u
 WHERE u.fb_id IN fb_array
   AND u.id NOT IN (SELECT f.friend_id 
                      FROM FRIENDS f
                     WHERE f.id = "my_id")

Null 不可:

   SELECT "my_id", u.id 
     FROM Users u
LEFT JOIN FRIENDS f ON f.friend_id = u.id
                   AND f.id = "my_id"
    WHERE u.fb_id IN fb_array
      AND f.fried_id IS NULL

詳細については:

配列内の値の数について話す

上記の 2 つの記事で実行されたテストには、10,000 個の異なる値を持つ 100 万行が含まれています。

于 2013-01-04T01:12:57.397 に答える