我有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;
但是此查询仅选择一个参与者
答案 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;
这仅返回您感兴趣的用户的聊天。