【问题标题】:JOIN over multiple tables with subselect for the newest result is not working在多个表上加入最新结果的子选择不起作用
【发布时间】:2020-01-07 08:48:56
【问题描述】:

TLDR:从其他表中获取最新行以及主表中的所有条目。 但是我还没有找到解决办法...

无论我尝试了什么,都没有真正解决它。 我的最后一个解决方案确实有效,直到时间戳不同会发生什么,所以它没有列出所有这些。

基本上我们有一个主表:

Servers: ID, userID, Name, updated (timestamp)

和资源表:

 cpu: ID, serverID, Load, updated (timestamp)

memory: ID, serverID,Usage, updated (timestamp)

我目前的版本,遗憾的是不能完全工作。

SELECT servers.name,servers.ID,servers.updated,cpu.Load,memory.Usage
FROM servers 

LEFT JOIN cpu ON cpu.serverID = servers.ID
LEFT JOIN memory ON memory.serverID = servers.ID 

AND cpu.updated = (SELECT cpu.updated FROM cpu ORDER BY cpu.updated DESC LIMIT 1) 

AND memory.updated = (SELECT memory.updated FROM memory ORDER BY memory.updated DESC LIMIT 1)

在时间戳不同之前确实有效也提供了多个结果,但我可以通过 GROUP BY servers.ID 轻松解决该问题。

没有子选择,我只有最旧的结果,但我的目标是获得最新的。

我的预期输出是:

Name, ID, Updated, Load, Usage
Server , 1, 00030303, 2.5, 40
Server2, 2, 03365345, 12.5, 80 

你们中有人有想法吗?如果您仍需要更多信息,请询问。 谢谢

【问题讨论】:

  • 您使用的是哪个 MySQL 版本?
  • @jarlh 10.3.17-MariaDB
  • 能否请您以表格格式提供您的预期输出
  • @fa06 我更新了帖子,请看一下。
  • 您使用的 MariaDB 版本支持 window functions。您可以使用ROW_NUMBER() 做您需要的事情。

标签: sql mariadb greatest-n-per-group


【解决方案1】:

您可以使用 subquery/group by 来查找 cpu/memory 的最后一条记录并加入服务器表:

SELECT s.name,s.ID,s.updated,c.Load,m.Usage
FROM servers s
LEFT JOIN (SELECT serverID,MAX(updated) AS lastUpdated FROM cpu GROUP BY serverID) cl
ON s.ID=cl.serverID
LEFT JOIN cpu c
ON cl.serverID=c.serverID
AND cl.lastUpdated=c.updated
LEFT JOIN (SELECT serverID,MAX(updated) AS lastUpdated FROM memory GROUP BY serverID) ml
ON ml.serverID=s.ID
LEFT JOIN memory m
ON m.serverID=ml.serverID
AND m.updated=ml.lastUpdated

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-05
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多