我有三个MySQL表,用于在内部跟踪正常运行时间。我喜欢做一些基本的统计数据(主要用于查询以运行最终的jpGraph),并且因为所有正常运行时间都是为了历史目的而不是丢弃,所以我喜欢在某些情况下显示最大值。
我无法想出办法。
select * from stats
inner join servers
on stats.sid = servers.sid
inner join os
on servers.os = os.oid
order by uptime desc;
基本上,stats中的sid可以具有非唯一的服务器名称,因为它是servername表中server_name的外键。因此,只有在列出多个服务器sid的情况下才应返回正常运行时间中最大的数量,显然如果只有一个,则应该打印它。我希望我能够很好地解释这一点。
sid uptime sid os server_name name oid
7 47647995 7 3 weinraub.net GNU/Linux Debian 3
9 5474640 9 2 hera Windows 7 2
1 3498373 1 4 ares Mac OS X Mountain Lion 4
8 1024013 8 2 jweinraub-dt3 Windows 7 2
8 946330 8 2 jweinraub-dt3 Windows 7 2
8 687139 8 2 jweinraub-dt3 Windows 7 2
所以,正如你在这里看到的,jweinraub-dt3有三个实例。我只想要每个server_name的最大正常运行时间。
mysql> desc stats;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| zid | int(11) | NO | PRI | NULL | auto_increment |
| sid | int(11) | NO | | NULL | |
| uptime | int(11) | NO | | NULL | |
| lastCheckin | varchar(10) | NO | | NULL | |
+-------------+-------------+------+-----+---------+----------------+
mysql> desc servers;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| sid | int(11) | NO | PRI | NULL | auto_increment |
| server_name | varchar(50) | NO | | NULL | |
| os | int(11) | NO | | NULL | |
+-------------+-------------+------+-----+---------+----------------+
mysql> desc os;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| oid | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | NULL | |
| logo | mediumblob | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
添加了表格架构
答案 0 :(得分:2)
尝试为每个sid找到最大的正常运行时间。
SELECT MAX(uptime) AS max_uptime,
sid
FROM stats
GROUP BY sid
然后,将该虚拟表加入其他内容。
SELECT whatever, whatever
FROM (
SELECT MAX(uptime) AS max_uptime,
sid
FROM stats
GROUP BY sid
) AS s
JOIN servers ON s.sid = servers.sid
JOIN os ON servers.os AS os.oid
ORDER BY max_uptime DESC
这里的技巧是在将stats表连接到其他表之前对其进行汇总(聚合)。
专业提示:不要在软件中使用SELECT *。当您尝试解释结果集中需要的内容时,请不要使用它。
答案 1 :(得分:0)
试试这个:
select ..., max(uptime)
from stats
...
group by sid
order by max(uptime) desc