在Node.js + PostgreSQL中的记录中查找公共字段

时间:2013-03-12 08:04:24

标签: node.js postgresql

我有一个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的输入数组。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

示例:

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

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

<@表示“包含在”数组中。请参阅postgres文档中的Array Functions and Operators

编辑:假设查询应该检索同时存在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;