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;
不需要聚合。
我有一个聊天应用程序。用户可以有很多聊天。聊天可以有很多用户。聊天有消息。消息有 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;
不需要聚合。