如何构造SQL查询以选择聊天参与者

时间:2019-02-27 16:01:32

标签: sql postgresql

我有3张桌子。用户(id,全名),聊天(id,名称)和Chats_Participants(聊天ID,用户ID)。我需要选择包含具有指定ID的用户的所有聊天。例如:

聊天:
1. 1,'测试'

用户:
 1. 1,'测试用户'
 2. 2,“测试用户2”

聊天参与者:
 1. 1(聊天ID),1(用户ID)
 2. 1(聊天ID),2(用户ID)

结果,我需要这样的东西:
1(chatId)'Test'(chatName)参与者(聊天中的用户数组)

首先我写了这个:

select chats.*, json_agg(users) as participants
    from chats
           inner join chats_participants c2 on chats.id = c2."chatId"
           inner join users on c2."userId" = users.id
    where users.id = $userId
    group by chats.id;

但是此查询仅选择一个参与者

2 个答案:

答案 0 :(得分:0)

您可以在postgresql中尝试使用array_agg。演示here。未在此处链接“用户”表,而是从chat_participants表中打印用户ID。

SELECT chats.chat_id,chats.name, array_agg(userid order by chats.chat_id) 
FROM chats 
INNER JOIN chat_participants ON chats.chat_id = chat_participants.chat_id
GROUP BY chats.chat_id,chats.name

答案 1 :(得分:0)

您似乎想要:

SELECT c.chat_id, c.name,
       array_agg(cp.userid order by cp.user_id) as users
FROM chats c INNER JOIN
     chat_participants cp
     ON c.chat_id = cp.chat_id
GROUP BY c.chat_id, c.name
HAVING SUM( (cp.userid = $userid)::int ) > 0;

这仅返回您感兴趣的用户的聊天。