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
相关产品推荐
相关产品推荐

