我的“用户”表是这样的
id name
1 UserA
2 UserB
3 UserC
4 UserD
我的“聊天”表是这样的
id text sentBy sentTo created
1 Hi UserB 1 2 2019-01-11
2 Hi 2 1 2019-01-12
3 Hi UserB 3 2 2019-01-13
4 Hello UserC 2 3 2019-01-14
5 Hello 3 2 2019-01-15
6 What u do 2 1 2019-01-16
7 Nothing 1 2 2019-01-17
8 Okay 2 1 2019-01-18
8 Hi UserA 3 1 2019-01-19
我想根据最后一条消息显示参与与登录用户对话的用户列表。 就像如果 UserA 登录系统那么列表应该是这样的
userId userName text created
3 UserC Hi UserA 2019-01-19
2 UserB Okay 2019-01-19
我尝试使用连接查询和分组依据但没有成功。 我正在将 PostgreSQL 与 koa js 一起使用。
最佳答案
您可以使用 DISTINCT ON
过滤掉对话中涉及的每个人的最新记录以外的所有内容。
SELECT DISTINCT ON( involved) involved AS userid,
u.NAME AS username,
text,
created
FROM (SELECT c.*,
CASE sentby
WHEN 1 THEN sentto
ELSE sentby
END AS involved
FROM chats c
WHERE c.sentby = 1
OR c.sentto = 1) s
JOIN users u
ON s.involved = u.id
ORDER BY involved,
created DESC
如果你想要一个通用的案例,你可以将它转换为一个 SQL 类型的 Postgres 函数并将 userid
作为参数传递并使用它代替 1。
关于sql - 获取参与对话的用户列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54954891/