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

数据库新手求助:查询每组计算机最新条目SQL结果字段不符

解决分组查询最新条目时字段不匹配的问题

嘿,我来帮你捋清楚这个问题~

你当前的SQL存在两个核心问题,导致e.type(你提到的「最后一个字段Name」应该是指这个字段吧?)和实际最新条目的值不匹配:

  1. 非聚合字段未纳入GROUP BY:你只按r.id分组,但e.type既不在GROUP BY子句里,也没有用聚合函数(比如MAX/MIN)包裹。在开启严格模式的数据库中,这种写法会直接报错;如果数据库允许(比如MySQL关闭了ONLY_FULL_GROUP_BY),它会随机从分组内的某条记录中选取e.type的值,这自然和你想要的「最新条目」的type不匹配。
  2. 聚合函数拼凑的记录不真实:你用max(e.start_time)、max(e.end_time)拿到的最大值,可能来自分组里的不同记录——比如A记录的start_time最大,B记录的end_time最大,组合出来的其实是一条不存在的“虚拟记录”,完全不符合你要「完整最新条目」的需求。

正确的解决方案

根据你的数据库版本,有两种可靠的写法:

方案1:用窗口函数(推荐,适合MySQL 8+、PostgreSQL等支持窗口函数的数据库)

窗口函数可以给每个房间的条目按更新时间排序,直接取排名第一的最新条目:

WITH ranked_entries AS (
    SELECT 
        r.id, 
        r.room_name, 
        e.type,
        e.start_time AS st,
        e.end_time AS et,
        e.timestamp AS updt,
        -- 按房间分组,更新时间倒序排名,rn=1就是该房间的最新条目
        ROW_NUMBER() OVER (PARTITION BY r.id ORDER BY e.timestamp DESC) AS rn
    FROM mrbs_room r 
    JOIN mrbs_entry e ON r.id = e.room_id 
    WHERE r.area_id = 1 AND r.disabled = 0
)
SELECT id, room_name, type, st, et, updt
FROM ranked_entries
WHERE rn = 1
ORDER BY room_name DESC;

方案2:用关联子查询(兼容老版本数据库)

如果你的数据库不支持窗口函数,先通过子查询找到每个房间的最新更新时间,再关联回原表拿到完整记录:

SELECT 
    r.id, 
    r.room_name, 
    e.type,
    e.start_time AS st,
    e.end_time AS et,
    e.timestamp AS updt
FROM mrbs_room r 
JOIN mrbs_entry e ON r.id = e.room_id 
WHERE r.area_id = 1 AND r.disabled = 0
-- 子查询定位当前房间的最新更新时间
AND e.timestamp = (
    SELECT MAX(timestamp) 
    FROM mrbs_entry 
    WHERE room_id = r.id
)
ORDER BY r.room_name DESC;

这两种写法都能保证你拿到的每个房间的所有字段,都来自同一条最新的记录,不会再出现字段不匹配的问题啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:20:19