选择所有与最后发送的消息有关的对话。

huangapple go评论62阅读模式
英文:

Select all conversations with last sent message

问题

我有以下的表格

创建表格 messages(
    id         大连续主键,
    创建时间 时间戳 包含时区,
    消息      文本,
    发送者ID   大整数,
    接收者ID   大整数
);

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

SELECT DISTINCT ON (LEAST(发送者ID, 接收者ID), GREATEST(发送者ID, 接收者ID))
       id, 消息, 创建时间
FROM   messages
ORDER  BY LEAST(发送者ID, 接收者ID), GREATEST(发送者ID, 接收者ID), 创建时间 DESC;

但我想要更改它,以便我获取每个对话的最后一条消息。而不是第一条。有什么办法可以做到这一点吗?可能使用不同的查询吗?

英文:

I have the following table

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

I'm select all unique conversations by using the following query

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;

But I'd like to change it so I get the last message from each conversation. Not the first. Any idea how I can do that? Possible using a different query?

答案1

得分: 0

如果created_at被定义为NOT NULL(而你只是没有显示它),那么你的查询已经实现了你所要求的功能。

请参考:

如果每对之间有很多消息,那么不同的查询方式会表现得(更)好。

对于很少的情况,使用DISTINCT ON就可以了。

英文:

If created_at is defined NOT NULL (and you are just not showing it), then your query already does what you ask for.

See:

If there are many messages per pair, then different query styles will perform (much) better.

For only few, DISTINCT ON is just right.

huangapple
  • 本文由 发表于 2023年6月18日 23:01:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/76501160.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定