在 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_id
是 null
时错误地显示 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
我在应用程序中进行聊天,需要 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_id
是 null
时错误地显示 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