Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询是否按日期范围对结果进行分组?_Mysql_Sql_Subquery - Fatal编程技术网

MySQL查询是否按日期范围对结果进行分组?

MySQL查询是否按日期范围对结果进行分组?,mysql,sql,subquery,Mysql,Sql,Subquery,我有一个系统,当他连接应用程序时,每2到5秒ping一次数据库。根据他的连接情况,ping的时间范围可能更大,比如10秒左右 例如: Pings: 1,4,6,8,9,12,16,20,50,180,187,189,200,203,206,210 ... 我想运行一个查询来获取ping之间不超过1分钟的范围,对它们进行分组,这样我就可以知道用户连接了多长时间,并保存到一个新表中,如: Connections table: user: X | start_date: 1 | end_date

我有一个系统,当他连接应用程序时,每2到5秒ping一次数据库。根据他的连接情况,ping的时间范围可能更大,比如10秒左右

例如:

Pings: 1,4,6,8,9,12,16,20,50,180,187,189,200,203,206,210 ...
我想运行一个查询来获取ping之间不超过1分钟的范围,对它们进行分组,这样我就可以知道用户连接了多长时间,并保存到一个新表中,如:

Connections table:
user: X | start_date: 1   | end_date: 50  | duration: 49
user: X | start_date: 180 | end_date: 210 | duration: 30
由于来自50180的ping。。。这超过了1分钟,被查询组中断

ping被存储为时间戳,因此可以很容易地转换为日期,从最后一次ping到第一次ping的范围将给出会话持续时间

在MySQL查询中是否有这样做的方法?有什么帮助吗

编辑:添加ping历史模式

id  int(11)
user_id int(11)
ping_timestamp  int(11)

谢谢,

我将您给定的示例数据翻了一番,以展示它如何与多个用户标识一起工作

看它在sqlfiddle中实时工作

在您的数据上尝试以下操作:

set @rnum = 1;
select user_id
     , min(ping_timestamp) start_date
     , max(ping_timestamp) end_date
     , max(ping_timestamp)-min(ping_timestamp) duration
  from ( select user_id
              , ping_timestamp
              , @rnum := if(ping_timestamp - @prev_ping_ts > 60, @rnum+1, @rnum) rnum
              , @prev_ping_ts := ping_timestamp
           from test2
          order by user_id, ping_timestamp
       ) t
 group by user_id, rnum
;

你能展示一下你的ping历史记录表是什么样子吗?id int(11)| user_id int(11)| ping_timestamp int(11)…如果数据按时间顺序插入表中,则不起作用,这是自然情况@rsanschez True,小错误,已经纠正。请随意删除否决票:)并感谢您的提示。谢谢,效果很好。我将设置一个cron,每10分钟读取一次这个表,并将所有过期的ping组(超过60秒)移动到一个新表中。因此,我可以将ping表保留为内存类型,只将最终结果保存在第二个表中,即查询如何打印它们。问题是,我需要从ping表中选择、插入和删除所选结果。有可能吗?你能帮我怎么做吗?提前感谢@fancyPants@Henrique当然,但我不明白到目前为止有什么问题。你必须更详细地解释,这听起来更适合作为一个新问题。我来看看。我在这里转载了这个问题。。。感谢您的帮助@FancyPantsy您也应该初始化
@prev\u ping\t
set @rnum = 1;
select user_id
     , min(ping_timestamp) start_date
     , max(ping_timestamp) end_date
     , max(ping_timestamp)-min(ping_timestamp) duration
  from ( select user_id
              , ping_timestamp
              , @rnum := if(ping_timestamp - @prev_ping_ts > 60, @rnum+1, @rnum) rnum
              , @prev_ping_ts := ping_timestamp
           from test2
          order by user_id, ping_timestamp
       ) t
 group by user_id, rnum
;