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

本教程将介绍MySQL查询按日期范围对结果进行分组?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

MySQL查询按日期范围对结果进行分组? 教程 第1张

问题描述

当他连接应用程序时,我的系统每 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

由于来自 ,50,180, ... 的 ping 超过 1 分钟,查询组不予考虑.

ping 存储为时间戳,因此可以轻松转换为日期,从最后一个 ping 到第一个 ping 的范围将为我提供会话持续时间.

有什么办法在 MySQL 查询中执行此操作?有什么帮助吗?

添加 ping 历史架构

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

谢谢,

推荐答案

我将你给定的示例数据翻了一番,以展示它怎么与多个 userId 一起工作.

sqlfiddle 这里查看它的实时工作.

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

好了关于MySQL查询按日期范围对结果进行分组?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。