【发布时间】:2021-07-03 13:28:10
【问题描述】:
我有 2 个表,分别名为 conversation 和 message。
我想选择按与对话相关的最后更新消息的顺序排序的所有对话。对话表没有updated_at,并且能够得到最后一个updated_at排序的所有对话,应该从表message的对话中最后创建的消息中扣除。
结果应该基于对话的最后一条消息。
我尝试的 SQL 没有给我正确的结果,我相信我应该使用连接,但由于我是 SQL 新手,所以无法真正了解它是如何实现的
select
*
from
conversation
inner join message on
conversation.id = message.conversation_id
order by
message.updated_at desc;
表格如下
对话
| id | topic | origin_type | origin_id | created_at |
|---|---|---|---|---|
| 1 | t1 | doc1 | xx1 | 2021-04-07 13:23:40 |
| 2 | t2 | doc2 | xx2 | 2021-04-07 14:23:40 |
| 3 | t3 | doc3 | xx3 | 2021-04-07 15:23:40 |
消息表
| id | conversation_id | message | created_at | updated_at |
|---|---|---|---|---|
| 1 | 1 | xxx | 2021-04-07 13:23:40 | 2021-04-07 13:23:40 |
| 2 | 2 | xxx | 2021-04-07 14:23:40 | 2021-04-07 14:23:40 |
| 3 | 3 | xxx | 2021-04-07 15:23:40 | 2021-04-07 15:23:40 |
看到表格我应该得到如下选择的结果,我相信 conversation.id = 3 包含最后创建和最近的消息。
| id | conversation_id |
|---|---|
| 1 | 3 |
| 2 | 2 |
| 3 | 1 |
在 SQL/PSQL 中我不知道如何进行这种选择
【问题讨论】:
-
如果您希望您的消息传递应用程序将被大量用户使用,最好将此数据保存在
conversation表中,以免读取所有转换以在以后对它们进行排序或所有消息以查找每个对话的最新消息(此外,每个对话包括多个人但相同的最新消息)。 -
我很欣赏这个建议,但我有一些细节要求我保持这种特定的方式
标签: sql postgresql