在 Postgres 中最后一次读取消息 ID 后计算聊天中的未读消息

Count unread messages in chats after last read message id in Postgres

我在应用程序中进行聊天,需要 select 给定聊天的未读消息。

每个聊天可以有多个用户,我为每个用户存储每个聊天的最后阅读消息 ID。

这是 select 用户聊天的所有消息数:

select c.id, count(cm.id)
from chats_users cu
inner join chats c
on c.id = cu.chat_id
left join chat_messages cm
on cm.chat_id = c.id
where cu.user_id = 1
group by c.id

如何修改此查询,使其仅统计每次聊天 chats_users.last_read_message_id 之后的消息数?

来自评论的解决方案查询

select c.id, count(cm.id)
from chats_users cu
inner join chats c
on c.id = cu.chat_id
left join chat_messages cm
on cm.chat_id = c.id
and cm.id > cu.last_read_message_id
where cu.user_id = 1
group by c.id

它几乎可以工作,但是当 cu.last_read_message_idnull 时错误地显示 0。

我添加了一个空条件,似乎有效:

select c.id, count(cm.id)
from chats_users cu
inner join chats c
on c.id = cu.chat_id
left join chat_messages cm
on cm.chat_id = c.id
and (cm.id > cu.last_read_message_id or cu.last_read_message_id is null)
where cu.user_id = 1
group by c.id

如果有更好的解决办法,请post回答

请注意,您不需要加入 chats:

select cu.chat_id, count(cm.id)
from chats_users cu left join
     chat_messages cm
     on cm.chat_id = cu.chat_id and
        (cm.id > cu.last_read_message_id or
         cu.last_read_message_id is null
        )
where cu.user_id = 1
group by cu.chat_id