2014-02-05 60 views
0

我有三個MySQL表用於跟蹤內部的正常運行時間。我喜歡做一些基本統計(主要用於查詢運行到最終的jpGraph),並且由於所有運行時間都是爲了歷史目的而保存的,而不是丟棄,所以我喜歡在某些情況下顯示最大值。返回MySQL中一個組中的最大數字

我想不通這樣做。

select * from stats 
inner join servers 
on stats.sid = servers.sid 
inner join os 
on servers.os = os.oid 
order by uptime desc; 

本質,SID統計中可以有非唯一的服務器名稱,因爲它是在服務器名稱表服務器名的外鍵。因此,只有在列出了多個服務器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

也許樣本數據和示例輸出將幫助 – Randy

+0

請解釋是否/爲什麼以下是不夠的:'從組中選擇最大(正常運行時間)server_name' – alexis

回答

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 

這裏的訣竅是在加入到其他表之前總結(聚合)統計表。

專業提示:不要在軟件中使用SELECT *。特別是當你試圖解釋你的結果集中需要什麼時,請不要使用它。

+0

我對innerjoins的想法仍然陌生,我無法弄清楚如何從多個表中獲取列以將外鍵匹配到另一個表的主鍵。所以..不是它的藉口,但我確實選擇*作爲快速__hack__獲得結果 –

+0

也許我搞砸了,但我在服務器上的加入os上發生錯誤...如果我刪除它,它會執行,並且從我原來的os加入工作。但是,這是一個很棒的幫助,並且能夠滿足我的需求,我只需要清理選擇/連接。 –

0

試試這個:

select  ..., max(uptime) 

from  stats 

... 

group by sid 
order by max(uptime) desc 
相關問題