返回MySQL中组中的最大数字

时间:2014-02-05 22:10:49

标签: mysql greatest-n-per-group

我有三个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    |                |
+-------+-------------+------+-----+---------+----------------+

添加了表格架构

2 个答案:

答案 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