我在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
答案 0 :(得分:0)
试试这个::
Select
Select MAX(nStatusNumber) from table,
Bandwidth,
Load,
Users,
ServerNumber,
DiskFree,
MemFree,
MAX(`TimeStamp`)
from your table
group by ServerNumber
答案 1 :(得分:0)
为了您的目的,您需要找到nServerNumber
和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查询)。