1

現在どのユーザーがどのチャットルームにいるかを記録する Postgres テーブルがあります。

「chatRoomId」と「userId」の 2 つの列があります。

したがって、次のようなレコードがあると仮定します。

chatRoomX, A
chatRoomX, B
chatRoomY, B
chatRoomY, C
chatRoomY, D

(つまり、chatRoomX のユーザー A、B。chatRoomY のユーザー B、C、D)

["A","B"] の配列が与えられた場合、どのチャットルームにいるのかを判断できる SQL クエリが必要です。クエリは "chatRoomX" で応答する必要があります。

これまでのところ、これは私が持っているものです:

client.query('SELECT chatRoomId FROM tableName WHERE 
 userId = $1 INTERSECT SELECT chatRoomId FROM tableName WHERE
 userId = $2', ["A","B"], function(err, results, done) { ... }

このクエリは、「chatRoomX」で正常に応答できます。しかし、ご覧のとおり、このクエリはハードコードされているため、可変長のユーザー ID の入力配列に対して機能する、より優れた SQL が必要です。

何か案は?

4

1 に答える 1

0

PostgreSQL 配列ロジックを使用して、配列 [A,B] が特定のチャットルーム内のすべての人によって形成された配列内に含まれているかどうかを確認できます。

例:

SELECT ARRAY['A','B'] <@
       ARRAY(SELECT userId FROM tableName WHERE chatRoomId='chatRoomX')

これは、単一のブール値 (tまたはf) を返します。2 人がチャットルームにいる場合は true、それ以外の場合は false です。

<@は、配列の「含まれている」ことを意味します。postgres ドキュメントの配列関数と演算子を参照してください。

編集:クエリが A と B が同時に存在するすべてを取得する必要があると仮定するchatRoomIdと、これは次のように記述できます。

  SELECT chatRoomId FROM
   (SELECT chatRoomId, array_agg(userId) AS a
     FROM tableName 
     GROUP BY userId) s
   WHERE ARRAY['A','B'] <@ s.a;
于 2013-03-12T13:44:21.553 に答える