0

首先,我对标题感到非常抱歉。我真的不知道如何正确地表达这个问题。如果有人能想到更好的措辞,请编辑或告诉我。

关于这个问题:

我有两张桌子。usage_logsserversservers存储我的客户端与特定服务器通信所需的所有服务器信息。usage_logs,当然,存储哪个用户使用了特定的服务器、哪个服务器以及使用了多长时间。

我需要一个查询来选择当前由最少用户使用的服务器的服务器信息。

这是我当前的查询:

SELECT servers.ip, servers.serverkey, servers.port, servers.id, COUNT(usage_logs.sid) nbr 
FROM servers 
LEFT JOIN usage_logs ON servers.id = boot_logs.sid 
WHERE usage_logs.time+usage_logs.date > 1344076143 
      AND usage_logs.sid IS NOT NULL 
      AND servers.status='ONLINE' 
GROUP BY sid 
ORDER BY nbr DESC;

1344076143可以用当前时间代替(在我的实际脚本中)。这个查询几乎可以工作。它正在选择一个服务器,由于其他服务器实际上并未在使用中,因此它不符合WHERE usage_logs.time+usage_logs.date > 1344076143标准,因此未在输出中列出。

我需要一种方法让它仍然列出该服务器,但我不知道如何。

另外,这usage_logs.sid IS NOT NULL是因为我最近才开始尝试改进使用跟踪,所以在今天之前,sid不存在。

usage_logs.sid是服务器 ID,最多匹配servers.id.

我一直在谷歌上搜索这个地狱,实际上JOIN之前甚至从未使用过声明,所以也请不要犹豫,纠正你发现的任何问题。我非常想提高我的 MySQL 技能。

4

1 回答 1

0

这些行被排除在外,因为您的WHERE子句中的条件有效地过滤掉了具有由外连接NULL生成的值的行(因为在 之后评估)。LEFTWHEREFROM / JOIN

您需要做的是ed 表OR上的条件,LEFT JOIN以获取在某个日期之后使用的服务器根本没有任何使用服务器。

尝试:

SELECT    a.ip, 
          a.serverkey, 
          a.port, 
          a.id, 
          COUNT(b.sid) nbr 
FROM      servers a
LEFT JOIN usage_logs b ON a.id = b.sid 
WHERE     a.status='ONLINE' AND 
          (b.time + b.date > 1344076143 OR b.sid IS NULL)
GROUP BY  a.id 
ORDER BY  nbr
于 2012-08-04T11:03:24.443 回答