我有一个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的输入数组。
有什么想法吗?
答案 0 :(得分:0)
您可以使用PostgreSQL数组逻辑来检查数组[A,B]是否包含在给定聊天室中所有人形成的数组中。
示例:
SELECT ARRAY['A','B'] <@
ARRAY(SELECT userId FROM tableName WHERE chatRoomId='chatRoomX')
这将返回一个布尔结果(t
或f
),如果这两个人在聊天室中则为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;