1

我有一个 Postgres 表,它记录了哪些用户现在在哪个聊天室中。

它有两列 - “chatRoomId”和“userId”。

所以假设我有这样的记录:

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”回复我。但是正如您所看到的,这个查询是硬编码的,因此我需要一个更好的 SQL,它应该适用于具有可变长度的用户 id 的输入数组。

有任何想法吗?

4

1 回答 1

0

您可以使用 PostgreSQL 数组逻辑来检查数组 [A,B] 是否包含在给定聊天室中所有人形成的数组中。

例子:

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

这将返回一个布尔结果(tf),如果两个人在聊天室中,则返回 true,否则返回 false。

<@表示数组的“被包含”。请参阅postgres 文档中的数组函数和运算符。

编辑:假设查询应该检索chatRoomId同时存在 A 和 B 的所有内容,这可以写成:

  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 回答