Select Postgres 中当前用户 ID 未读的聊天消息

Select chat messages unread by current user id in Postgres

我有一个聊天应用程序。用户可以有很多聊天。聊天可以有很多用户。聊天有消息。消息有 readers.

简化的数据库结构:

# users
id

# chats
id

# chat_messages
id
chat_id (fk chats.id)
author_id (fk users.id)
message

# chat_message_readers
id
message_id (fk chat_messages.id)
user_id (fk users.id)

我正在尝试获取用户未阅读的消息列表(没有 reader 和用户 ID 的消息)。我的尝试:

包含 reader 的消息列表:

select cm.id, count(cmr.id) as readers
from chat_messages as cm
left join chat_message_readers as cmr
on cm.id = cmr.message_id
group by cm.id

没有 reader 的消息列表:

select cm.id, count(cmr.id) as readers
from chat_messages as cm
left join chat_message_readers as cmr
on cm.id = cmr.message_id
where cmr.user_id is null
group by cm.id

我坚持将上面的内容与当前用户 ID 结合起来。应该 select 除当前用户阅读的消息之外的所有消息(例如 chat_message_readers.user_id != 1)。希望得到一些帮助

您可以使用 left join 版本:

select cm.id, (cmr.user_id is not null) as has_been_read_by_user
from chat_messages cm left join
     chat_message_readers cmr
     on cm.id = cmr.message_id and cmr.user_id = ?
where cmr.user_id is null;

不需要聚合。