2012-12-06 71 views
0

我在mysql上失敗了,並且真的可以做一些幫助。我不知道它會被調用什麼,並且我所有使用DISTINCT和GROUP BY組合的嘗試都沒有解決。Mysql - 顯示來自每個唯一字段的1個最新條目

我有服務器監控數據與這些列的表:

nStatusNumber 
Bandwidth 
Load 
Users 
ServerNumber 
DiskFree 
MemFree 
TimeStamp 

**nStatusNumber** - A unique number increasing for each entry 

**ServerNumber** - A unique number for each server 

對於我的儀表板頂部對於這一點,我需要顯示最近的每個唯一的服務器報告。

//我們監控多少臺服務器?

$nNumServers = mysql_numrows(mysql_query("SELECT DISTINCT(ServerNumber) FROM server_status;")); 

//獲取我們的服務器列表

$strQuery = "SELECT * FROM server_status ORDER BY nStatusNumber DESC limit ".$nNumServers.";"; 

然後遍歷結果,直到我們到了$ nNumServers。這個工作起初,直到服務器開始下降/上升和報告順序混亂。說20個服務器,最近的20個結果不一定是每個服務器1個。

我試圖找出這個匆忙,並在它失敗。我已經嘗試了各種各樣的DISTINCT和GROUP BY的組合,目前還沒有運氣,並且希望得到關於什麼可能是一個令人尷尬的簡單問題的指導,我只是無法看到答案。

謝謝!

PS - 下面是我一直在嘗試的示例查詢,顯示了我遇到的問題。檢查「nStatusNumber」字段,這些應該顯示僅針對每個服務器的最新結果 - http://pastebin.com/raw.php?i=ngXLRhd6

PPS - 設置max(nStatusNumber)不會給出準確的結果。我不想要一些平均/總和/中位數,我需要每個服務器報告的最新ACTUAL數據。你需要 http://pastebin.com/raw.php?i=eyuPD7vj

+0

這麼快速的問題,這個位「起初,這些工作起作用,直到服務器開始下降/上升,報表順序混亂。說20個服務器,最近的20個結果不一定來自每個服務器。 ---你輪詢數據庫的服務器可用性,而不是輪詢服務器本身? –

+0

我有一個cshjob ssh到每個服務器並收集數據並將該數據發佈到數據庫表。儀表板然後應該只顯示最近的結果(失敗),以及每個服務器都有可用的圖表和歷史數據(正常工作) –

+1

可能重複[檢索每個組中的最後一條記錄](http:/ /stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group) –

回答

0

你的目的,以找到獨特的nServerNumberTimeStamp行:爲查詢繼承人以上實例的結果。這不像只說MAX(TimeStamp)那麼簡單,因爲您需要查找與其對應的行。

雖然我不是SQL專家,但您可以嘗試一下,看看它是否有效。

SELECT A.nServerNumber, A.nStatusNumber, A.nVNStatsBandwidth, A.fLoad, A.nUsers, 
    A.nUsersPaid, A.nServerNumber, A.nFreeDisk, A.nTotalDisk, A.nFreeMemory, 
    A.nTotalMemory, A.TimeStamp 
FROM server_status A 
INNER JOIN 
(
    SELECT nServerNumber, MAX(TimeStamp) as `TimeStamp` 
    FROM server_status 
    GROUP BY nServerNumber 
) B 
ON A.nServerNumber = B.nServerNumber 
AND A.TimeStamp = B.TimeStamp 
ORDER BY A.nServerNumber ASC; 

此查詢將爲您提供所有服務器及其最新信息。所以,如果你想要服務器的總數,只需對該結果運行mysql_numrows(...)函數,並且如果希望數據只是遍歷相同的結果(不需要激發兩個單獨的SQL查詢)。

+0

謝謝你,我結束了對這個使用一個微小的變化:) –

0

試試這個::

Select 
Select MAX(nStatusNumber) from table, 
Bandwidth, 
Load, 
Users, 
ServerNumber, 
DiskFree, 
MemFree, 
MAX(`TimeStamp`) 

from your table 
group by ServerNumber 
+0

謝謝,但這與我之前嘗試過的類似,並且不能按預期工作。單看時間戳字段看起來就像最近的結果,但當最近的結果高達約50,000時,nStatusNumber的值非常低(1,2,3,4等)。 響應示例: http://pastebin.com/raw.php?i=ngXLRhd6 –

+0

如果您需要nstatusNumber爲最大值,我已更新我的查詢 –

+0

我發佈了您的查詢結果,以及一個顯示20個最新狀態報告的簡單查詢。正如你所看到的,在你的查詢中返回的信息是不準確的。 http://pastebin.com/raw.php?i=eyuPD7vj –

相關問題