如何为不符合WHERE标准的列“输入”计数?

时间:2012-08-04 10:48:24

标签: mysql select

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

关于问题:

我有两张桌子。 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技能。

1 个答案:

答案 0 :(得分:0)

正在排除这些行,因为WHERE子句中的条件有效地过滤了NULL外部联接生成LEFT值的行(因为WHEREFROM / JOINOR)之后评估。

您需要做的是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 ed表上的条件,以获取在特定日期之后使用的服务器 根本没有使用的服务器。

尝试:

{{1}}