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

如何在查询中添加子查询以显示房间内的最后一条消息?

解决方案:获取用户ID1参与的聊天室及各房间最后一条消息

方法一:通过聚合子查询获取最新消息

先通过子查询找出每个房间的最新消息ID(假设room_messages.id为自增主键,值越大消息越新),再关联回消息表拿到具体内容,同时保留原查询的筛选逻辑:

SELECT 
    r.id AS 房间ID,
    r.name AS 房间名称,
    rm.text AS 最后一条消息内容,
    rm.is_read AS 消息已读状态
FROM rooms AS r
LEFT JOIN room_participants rp ON r.id = rp.room_id
-- 子查询:获取每个房间的最新消息ID
LEFT JOIN (
    SELECT room_id, MAX(id) AS 最新消息ID
    FROM room_messages
    GROUP BY room_id
) latest_msg ON r.id = latest_msg.room_id
-- 关联到具体消息记录
LEFT JOIN room_messages rm ON latest_msg.最新消息ID = rm.id
WHERE rp."participantType" = 'USER' AND rp.participant_id = 1;

方法二:使用窗口函数筛选最新消息

通过ROW_NUMBER()窗口函数对每个房间的消息按ID倒序排序,取排序后的第一条即为最新消息:

SELECT 
    房间ID,
    房间名称,
    最后一条消息内容,
    消息已读状态
FROM (
    SELECT 
        r.id AS 房间ID,
        r.name AS 房间名称,
        rm.text AS 最后一条消息内容,
        rm.is_read AS 消息已读状态,
        -- 按房间分组,消息ID降序排序
        ROW_NUMBER() OVER (PARTITION BY r.id ORDER BY rm.id DESC) AS 排序序号
    FROM rooms AS r
    LEFT JOIN room_participants rp ON r.id = rp.room_id
    LEFT JOIN room_messages rm ON r.id = rm.room_id
    WHERE rp."participantType" = 'USER' AND rp.participant_id = 1
) AS 房间消息汇总
WHERE 排序序号 = 1;

注:假设room_messages表包含room_id字段(消息必然归属某个房间,推测原表结构描述遗漏该字段),否则无法关联到对应聊天室。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:02:50