postgresql 选择最后发送消息的所有对话

ruoxqz4g  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(138)

我有下表

create table messages(
    id         bigserial primary key,
    created_at timestamp with time zone,
    message    text,
    from_id    bigint,
    to_id      bigint
);

我使用以下查询选择所有唯一的对话

SELECT DISTINCT ON (LEAST(from_id, to_id), GREATEST(from_id, to_id))
       id, message, created_at
FROM   messages
ORDER  BY LEAST(from_id, to_id), GREATEST(from_id, to_id), created_at DESC;

但我想改一下这样我就能收到每次对话的最后一条信息。不是第一个。你知道我该怎么做吗是否可以使用不同的查询?

vybvopom

vybvopom1#

如果created_at被定义为NOT NULL(只是没有显示出来),那么查询已经完成了所要求的操作。
参见:

  • 是否选择每个GROUP BY组中的第一行?
  • 按ASC列排序,但先按NULL值排序?

如果每对有许多消息,那么不同的查询样式将执行得更好。

  • 优化GROUP BY查询以检索每个用户的最新行

对于fewDISTINCT ON刚刚好。

相关问题