You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询包含未读消息数量的聊天列表(PostgreSQL)

问题:统计指定请求聊天列表中的未读消息数量

表结构

PostgreSQL中存储聊天记录的表request_messages结构如下:

id (PRIMARY KEY)
professional_id (FOREIGN KEY)
request_id (FOREIGN KEY)
message
created_by (FOREIGN KEY)
created_at
read_at

需求

需要获取指定请求(request_id = $1)的聊天列表,同时为每个聊天条目添加未读消息数量(即read_at IS NULL的消息条数)。

原查询语句

当前用于获取聊天列表的SQL:

SELECT
rm.professional_id,
CONCAT(u.first_name, ' ', u.last_name) AS professional_full_name,
FROM request_messages AS rm 
LEFT JOIN users AS u ON (rm.professional_id = u.id) 
WHERE rm.request_id = $1 
GROUP BY rm.professional_id, professional_full_name

修改后的查询语句

可以通过两种方式添加未读消息统计列,以下是可行的写法:

写法一:使用COUNT + CASE表达式

SELECT
rm.professional_id,
CONCAT(u.first_name, ' ', u.last_name) AS professional_full_name,
COUNT(CASE WHEN rm.read_at IS NULL THEN 1 END) AS unread_count
FROM request_messages AS rm 
LEFT JOIN users AS u ON (rm.professional_id = u.id) 
WHERE rm.request_id = $1 
GROUP BY rm.professional_id, professional_full_name

写法二:使用SUM + 布尔值转换

PostgreSQL会自动将布尔值转换为整数(true=1,false=0),可以简化统计逻辑:

SELECT
rm.professional_id,
CONCAT(u.first_name, ' ', u.last_name) AS professional_full_name,
SUM((rm.read_at IS NULL)::INT) AS unread_count
FROM request_messages AS rm 
LEFT JOIN users AS u ON (rm.professional_id = u.id) 
WHERE rm.request_id = $1 
GROUP BY rm.professional_id, professional_full_name

说明

两种写法均能精准统计每个professional_id对应的未读消息数,仅对read_at为NULL的记录进行计数;分组条件保持不变,确保每个聊天条目按专业人员维度聚合。

内容的提问来源于stack exchange,提问作者Francesco Vibert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:52:04