Mysql - 显示每个独特字段的最新条目

时间:2012-12-06 06:49:17

标签: mysql greatest-n-per-group

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

2 个答案:

答案 0 :(得分:0)

试试这个::

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

from your table 
group by ServerNumber

答案 1 :(得分: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查询)。