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

MySQL多表INNER JOIN查询获取dc_systemusage最新条目问题

解决多表JOIN时获取dc_systemusage最新条目的方法

你的问题核心是分组时错误地取了dc_systemusage的任意旧条目,ORDER BY只是对最终结果排序,无法改变分组阶段选取的行。下面是两种可靠的解决方法:

方法一:通过子查询获取每个服务器的最新记录ID(推荐)

假设dc_systemusage的id是自增主键(最新记录对应最大ID),先通过子查询拿到每个服务器对应的最新ID,再关联原表获取完整数据:

SELECT 
    i.id, i.hz, i.v, i.t, i.u, i.temp, i.c1,
    s.server, s.hostname, h.codes, s.cpus
FROM dc_servers AS s
INNER JOIN dc_hardware AS h ON s.server = h.server
-- 子查询:获取每个server的最新systemusage记录ID
INNER JOIN (
    SELECT server, MAX(id) AS latest_id
    FROM dc_systemusage
    GROUP BY server
) AS latest_i ON s.server = latest_i.server
-- 关联到最新的那条记录
INNER JOIN dc_systemusage AS i ON latest_i.latest_id = i.id;

方法二:按时间字段获取最新记录(更准确,若存在时间字段)

如果dc_systemusage的t字段是记录生成的时间戳,用时间判断最新比ID更可靠(避免ID不连续的情况):

SELECT 
    i.id, i.hz, i.v, i.t, i.u, i.temp, i.c1,
    s.server, s.hostname, h.codes, s.cpus
FROM dc_servers AS s
INNER JOIN dc_hardware AS h ON s.server = h.server
INNER JOIN (
    SELECT server, MAX(t) AS latest_time
    FROM dc_systemusage
    GROUP BY server
) AS latest_i ON s.server = latest_i.server
INNER JOIN dc_systemusage AS i 
    ON s.server = i.server 
    AND i.t = latest_i.latest_time;

注意事项

  • 不需要加DISTINCT:因为每个服务器在dc_servers和dc_hardware中仅一行,关联最新的dc_systemusage记录也仅一行,结果不会重复。
  • 若同一服务器同一时间有多条记录,方法二可能返回多行,此时可以结合MAX(id)进一步筛选,子查询改为:
    SELECT server, MAX(id) AS latest_id
    FROM dc_systemusage
    WHERE t = (SELECT MAX(t) FROM dc_systemusage WHERE server = dc_systemusage.server)
    GROUP BY server
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:10:29