MYSQL:用户上次在一段时间内处于活动状态[重复]

Posted

技术标签:

【中文标题】MYSQL:用户上次在一段时间内处于活动状态[重复]【英文标题】:MYSQL: Last time a user was active within a time period [duplicate] 【发布时间】:2019-06-13 19:34:19 【问题描述】:

我有一个 JS 将日志发送回 php 页面,以将条目插入 mysql DB,格式如下:

id      ipad       uid  ts                  urlpath  
1455    1.1.1.15    13  19/01/2019 07:32    http://1.1.1.151/useradmin.php  
1456    1.1.1.15    13  19/01/2019 07:33    http://1.1.1.151/useradmin.php  
1460    1.1.1.15    13  19/01/2019 07:37    http://1.1.1.151/useradmin.php  
1461    1.1.1.15    19  19/01/2019 08:05    http://1.1.1.151/index.php  
1462    1.1.1.15    19  19/01/2019 08:05    http://1.1.1.151/index.php  
1463    1.1.1.15    19  19/01/2019 08:05    http://1.1.1.151/index.php  
1464    1.1.1.15    13  19/01/2019 23:13    http://1.1.1.151/useradmin.php 

我要做的是在给定时间段(例如 30 分钟、6 小时、30 天等)内按时间戳(ts)返回 uid 的最新 SINGLE 条目 我尝试了几段代码,但它从不返回最新条目。我现在使用的代码是:

SELECT *  
  FROM usertrack  
 WHERE ts >= NOW() - INTERVAL 43830 MINUTE  
 GROUP 
    BY uid  
HAVING MAX(ts)  
 ORDER 
    BY ts DESC 

但这只是随机选择一个条目,而不是最新的。

任何帮助将不胜感激,因为我已经失去了大量的头发。

【问题讨论】:

您是要按 uid 对结果进行分组,还是要为一个 uid 获取单个条目? 这听起来像是greatest-n-per-group 问题。查看带有该标签的其他答案。您可能会问一个已经回答过很多次的问题。 【参考方案1】:

这可以通过相关子查询来完成,例如:

SELECT u.*
FROM usertrack u
WHERE NOT EXISTS (
    SELECT 1 FROM usertrack u1 WHERE u1.ts > u.ts AND u1.uid = u.uid
) AND ts >= NOW() - INTERVAL 43830 MINUTE 

【讨论】:

非常感谢 GMB。辛苦了。 欢迎@Keith! PS @Keith :由于这个问题被标记为重复,您可能仍然可以查看链接的其他问题,它可能很重要(我的查询还有其他可能的解决方案)

以上是关于MYSQL:用户上次在一段时间内处于活动状态[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 和 Android 的给定时间检测用户是不是仅在一台设备上处于活动状态

C Windows API确定用户是不是在一段时间内不活动

停止设备进入睡眠模式一段时间

允许在 UWP 中创建的 PWA 在最小化时不处于非活动状态

通过Swift中的触摸检测应用程序何时处于活动状态或非活动状态[重复]

如何判断浏览器/选项卡是不是处于活动状态[重复]