当用户连接应用程序时,我有一个系统每 2 到 5 秒 ping 一次数据库。根据他的连接,ping 时间范围可以更大,比如 10 秒左右。
例子:
Pings: 1,4,6,8,9,12,16,20,50,180,187,189,200,203,206,210 ...
我正在运行一个查询以获取 ping 之间不超过 1 分钟的范围,对它们进行分组,这样我就可以知道用户连接了多长时间:
这是我正在运行以选择结果的查询,正如@fancyPants 在这个问题上所建议的那样: MySQL query to group results by date range?
select
userid, groupnum,
min(ping) as start_date,
max(ping) as end_date,
max(ping) - min(ping) as duration
from (
select
*,
@groupnum := if(@prevUser != userId, @groupnum + 1, @groupnum),
@groupnum := if(ping - @prevTS > 60, @groupnum + 1, @groupnum) as groupnum,
@prevUser := userid,
@prevTS := ping
from
Table1 t
, (select @groupnum:=1, @prevTS:=NULL, @prevUser:=NULL) vars
order by userid, ping
) sq
group by userid, groupnum
产生以下结果:
user: X | start_date: 1 | end_date: 50 | duration: 49
user: X | start_date: 180 | end_date: 210 | duration: 30
我需要帮助,在此查询中添加将执行以下操作的语句。
第一个。将选定的行插入到具有查询返回的完全相同架构的新表中:
id: auto_increment| user: X | start_date: 1 | end_date: 50 | duration: 49
id: auto_increment| user: X | start_date: 180 | end_date: 210 | duration: 30
第二。删除在查询中选择并插入到新表中的选定行。
此查询将由服务器上的 cronjob 每 10 分钟运行一次。所以我可以清理 ping 表,它会受到严重影响,并将我们要显示给冲浪者的值存储到一个新表中。
在新查询中,我需要一个子句来过滤未过期的 ping。未过期的 ping 是在 cron 运行的当前时间之前不超过 60 秒完成的。例如,如果 now = 100,则最后一次抓取的 ping 不能小于 41。这样,当 cron 运行时,我不会从仍在 ping 数据库的用户中选择行。
它可以在一个查询中完成,还是我需要两个?
谢谢,