首先,我非常抱歉标题。我真的不知道如何正确地说出这个问题。如果有人能想到更好的措辞,请编辑或告诉我。
关于问题:
我有两张桌子。 usage_logs
和servers
。 servers
存储客户端与特定服务器通信所需的所有服务器信息。当然,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技能。
答案 0 :(得分:0)
正在排除这些行,因为WHERE
子句中的条件有效地过滤了NULL
外部联接生成LEFT
值的行(因为WHERE
是FROM / JOIN
在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
ed表上的条件,以获取在特定日期之后使用的服务器 或 根本没有使用的服务器。
尝试:
{{1}}