sql - 获取参与对话的用户列表

标签 sql postgresql

我的“用户”表是这样的

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 

Demo

如果你想要一个通用的案例,你可以将它转换为一个 SQL 类型的 Postgres 函数并将 userid 作为参数传递并使用它代替 1。

关于sql - 获取参与对话的用户列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54954891/

相关文章:

sql - Sybase Jconnect 驱动程序 - 默认获取大小是多少以及增加获取大小是否对我有利

sql - 如何在其他过程中使用存储过程中创建的查询

sql - 集合的自内连接、聚合和求和

sql - 报告一组记录的分组平均值

sql - 每月累计总计和 Postgresql

mysql - 如何将两个 FK 从一个表连接到另一个表?

mysql - 唯一 VS 插入忽略

sql - 临时存储过程范围

php - 检查用户名是否已被使用

hibernate - Spring,Blob 下载,byte[] 大小增加两倍