sql - 给定一个用户 ID,获取他们所有的收件人 channel 和最后一条消息预览?

标签 sql postgresql

这是为了获取群聊列表,就像您在任何聊天应用程序上看到的一样。

该示例显示直接消息,但从技术上讲,3 个以上的用户可以加入聊天 channel 。假设没有用户表。

我希望能够传入 some_user 并“获取 some_user 参与的所有 channel , channel 成员不是 some_user(收件人),以及发送到 channel 进行预览的最后一条消息,按最后一条消息排序created_at desc”。

channel
---
id(pk)

channel_user
---
channel_id(fk) | user_id

message
---
id(pk) | channel_id(fk) | sender_id | text | created_at

channel
---
1
2

channel_user
---
1 | "Elon"
1 | "Mark"
2 | "Steve"
2 | "Elon"

message
---
3 | 1 | "Elon" | "AI will destroy us all" | timestamp(late)
4 | 1 | "Mark" | "No it won't"            | timestamp(later)
5 | 2 | "Steve"| "Sup Elon"               | timestamp(latest)

传入用户“Elon”并得到如下内容:

channel_id | recipient(s)             | last_message  | last_message_sender | last_message_created_at
---
2          | "Steve" or ["Steve",...] | "Sup Elon"    | "Steve"             | timestamp(latest)
1          | "Mark" or ["Mark",...]   | "No it won't" | "Mark"              | timestamp(later)

最佳答案

我认为像下面这样的东西应该让你进入球场:

SELECT *
FROM
(
        SELECT m.channel_id, m.sender_id, m.text, m.created_at, row_number() over (PARTITION BY m.channel_id ORDER BY created_at desc) as message_rank
        FROM    
            channel_user cu
            INNER JOIN message m ON 
                cu.channel_id = m.channel_id
        WHERE
            cu.user_id = 'Elon'
            AND m.user_id <> 'Elon'
) sub
WHERE sub.message_rank = 1

关于sql - 给定一个用户 ID,获取他们所有的收件人 channel 和最后一条消息预览?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50009489/

相关文章:

MYSQL 查询连接表

java - 将 org.jooq.TableField<Long> 转换为 org.jooq.TableField<BigDecimal>

mysql - SQL 查询带来字段中具有最低值的链接记录

postgresql - 如何传递 ENUM 变量作为 POSTGRESQL 函数的输入

postgresql - 无法使用本地 IP 地址作为我的主机连接到 postgres 服务器(例如 : 192. 168.x.x)

SQL 减去最小值和最大值

mysql - 带有前导空格的列别名导致错误 : Unknown column 'BAR. COL1' in 'field list'

node.js - 如何使用 sequelize 执行此请求?

java - Hibernate <generator> 混淆

mysql - 查询多个连接或添加额外列