所以我的脚本目前强制用户每隔10分钟发送一次“ping”。这会使用用户ID和当前时间戳将记录插入MySQL。
我想要实现的是查看是否有任何用户最近离线了。 理论上,这将选择最近在线(20分钟前)用户,然后检查在过去的11分钟内是否没有ping,除了我似乎无法弄清楚如何。 这就是我到目前为止所做的:
SELECT * FROM status WHERE time > (CURTIME() - 1200) AND time < (CURTIME() - 660)
我必须补充一点,我与PHP结合使用,但这不应该真的重要。
感谢任何帮助。
答案 0 :(得分:1)
有很多方法可以做到这一点。假设您有一个名为id
的主键:
SELECT *
FROM status
LEFT JOIN (
SELECT id
FROM status
WHERE time > (CURTIME() - 660) // was on within last 5 minutes
) sub ON
sub.id = status.id
WHERE
time > (CURTIME() - 1200) // was on within last 20 minutes
AND sub.id IS NULL; // was on within last 20, but not last 5
答案 1 :(得分:1)
我会尝试这样的事情:
SELECT TIMEDIFF(CURTIME(), MAX(s.time)) AS duration, s.user
FROM status s
GROUP BY s.user
HAVING duration > 660 AND duration < 1200;
如果用户名未存储在状态表中。您应该在Status和User之间执行JOIN。
如果您想检查特定范围的持续时间,也可以使用BETWEEN语句。
编辑:感谢Madbreaks关于“最近”的约束。您可以添加AND持续时间&lt; xxxx不检索旧的持续时间并仅在结果集中保留“最近”状态。
答案 2 :(得分:-2)
之间使用:
SELECT *
FROM `status`
WHERE (`time` BETWEEN (CURTIME() - 660) AND (CURTIME() - 1200))