我有 3 张桌子:
CREATE TABLE IF NOT EXISTS `disksinfo` (
`idx` int(10) NOT NULL AUTO_INCREMENT,
`hostinfo_idx` int(10) DEFAULT NULL,
`id` char(30) DEFAULT NULL,
`name` char(30) DEFAULT NULL,
`size` bigint(20) DEFAULT NULL,
`freespace` bigint(20) DEFAULT NULL,
PRIMARY KEY (`idx`)
)
CREATE TABLE IF NOT EXISTS `hostinfo` (
`idx` int(10) NOT NULL AUTO_INCREMENT,
`host_idx` int(11) DEFAULT NULL,
`probetime` datetime DEFAULT NULL,
`processor_load` tinyint(4) DEFAULT NULL,
`memory_total` bigint(20) DEFAULT NULL,
`memory_free` bigint(20) DEFAULT NULL,
PRIMARY KEY (`idx`)
)
CREATE TABLE IF NOT EXISTS `hosts` (
`idx` int(10) NOT NULL AUTO_INCREMENT,
`name` char(30) DEFAULT '0',
PRIMARY KEY (`idx`)
)
基本上,hosts 只是在 hostinfo 表中使用的固定主机名列表(hostinfo.host_idx = hosts.idx) hostinfo 是一个表,每隔几分钟就会用来自所有主机的数据填充一次,此外,对于每个 hostinfo 行,至少有一个 diskinfo 行被建造。每个磁盘信息行包含至少一个磁盘的信息(因此,对于某些主机,磁盘信息有 3-4 行)。磁盘信息.hostinfo_idx = 主机信息.idx。hostinfo.probetime 只是创建数据快照的时间。
我现在要执行的是为每个特定的不同主机(hostinfo.host_idx)选择最后一个主机信息(.probetime),同时加入有关磁盘(diskinfo 表)和主机名(主机表)的信息
我带来了这个:
SELECT hinfo.idx,
hinfo.host_idx,
hinfo.processor_load,
hinfo.memory_total,
hinfo.memory_free,
hnames.idx,
hnames.name,
disks.hostinfo_idx,
disks.id,
disks.name,
disks.size,
disks.freespace,
Max(hinfo.probetime)
FROM systeminfo.hostinfo AS hinfo
INNER JOIN systeminfo.hosts AS hnames
ON hnames.idx = hinfo.host_idx
INNER JOIN systeminfo.disksinfo AS disks
ON disks.hostinfo_idx = hinfo.idx
GROUP BY disks.id,
hnames.name
ORDER BY hnames.name,
disks.id
它似乎工作!但是,它是 100% 正确的吗?是最优的吗?感谢您的提示!