0

我在 mysql 上失败了,真的可以得到一些帮助。我不知道它会被称为什么,我所有尝试使用 DISTINCT 和 GROUP BY 的组合都没有成功。

我有一个包含这些列的服务器监控数据表:

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) 不会给出准确的结果。我不想要一些平均/总和/中位数,我需要每台服务器报告的最新实际数据。以下是查询的更多示例结果:http://pastebin.com/raw.php?i= eyuPD7vj

4

2 回答 2

0

出于您的目的,您需要找到 anServerNumber和唯一的行TimeStamp。这并不像你说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 查询)。

于 2012-12-06T08:53:10.683 回答
0

尝试这个 ::

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

from your table 
group by ServerNumber
于 2012-12-06T06:54:18.207 回答