确定用户是否在MySQL中脱机的最佳方法

时间:2014-12-05 23:25:15

标签: mysql

所以我的脚本目前强制用户每隔10分钟发送一次“ping”。这会使用用户ID和当前时间戳将记录插入MySQL。

我想要实现的是查看是否有任何用户最近离线了。 理论上,这将选择最近在线(20分钟前)用户,然后检查在过去的11分钟内是否没有ping,除了我似乎无法弄清楚如何。 这就是我到目前为止所做的:

SELECT * FROM status WHERE time > (CURTIME() - 1200) AND time < (CURTIME() - 660)

我必须补充一点,我与PHP结合使用,但这不应该真的重要。

感谢任何帮助。

3 个答案:

答案 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))