Mysql连续数据查询的简单方法
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,下面一起来了解下Mysql连续数据查询的简单方法,相信大家看完肯定会受益匪浅,文字在精不在多,希望Mysql连续数据查询的简单方法这篇短内容是你想要的。顺序行号 - 减首差值 = 连续差块顺序行号 如
千家信息网最后更新 2025年11月08日Mysql连续数据查询的简单方法
下面一起来了解下Mysql连续数据查询的简单方法,相信大家看完肯定会受益匪浅,文字在精不在多,希望Mysql连续数据查询的简单方法这篇短内容是你想要的。
顺序行号 - 减首差值 = 连续差块
顺序行号 如同 oracle 中的 rownum 但mysql目前还没有这个功能,所以只能通过局部变量来实现,
减首差值 就是每条记录与最开始记录的差(需要保证这个差值与顺序行号递增值相同,当然如果本来就是自增值则不需要单独计算)
只要 顺序行号与减首差值保持相同递增值则 连续差块 值相同,就可以统计出连续长度
示例表:(以简单的签到表为例)
create table user_sign(id int unsigned primary key auto_increment,user_id int unsigned not null comment '用户ID',date date not null comment '签到日期',created_time int unsigned not null comment '创建时间',updated_time int unsigned not null comment '修改时间')engine=innodb default charset=utf8 comment '用户签到';
随机生成数据(创建函数随机生成签到数据)
create function insert_sign_data(num int)returns intbegindeclare _num int default 0;declare _date date;declare _tmpdate date;declare _user_id int;declare line int default 0;declare _get_last cursor for select date from user_sign where user_id=_user_id order by date desc limit 1;declare continue handler for SQLSTATE '02000' set line = 1;while _num < num doset _user_id = CEIL( RAND( ) * 500 );open _get_last;fetch _get_last into _tmpdate;IF line THENset _date = FROM_UNIXTIME( unix_timestamp( ) - 86400 * round( RAND( ) * 200 ), '%Y-%m-%d' );set line = 0;ELSEset _date = FROM_UNIXTIME( unix_timestamp( _tmpdate ) + 86400 * round( RAND( ) * 2 + 1), '%Y-%m-%d' );END IF;INSERT INTO user_sign ( user_id, date, created_time, updated_time ) VALUES (_user_id, _date, unix_timestamp( ), unix_timestamp( ));set _num = _num + 1;close _get_last;end while;return _num;end
生成数据(由于生成时有判断最近打卡日期生成有会点慢)
select insert_sign_data(20000);
提取出连续打卡超过6天的用户
SELECTuser_id,val - ( @rownum := @rownum + 1 ) AS type,group_concat( date ) AS date_join,count( 1 ) num FROM(SELECTus1.date,us1.user_id,( unix_timestamp( us1.date ) - min_timestamp ) / 86400 + 1 AS val FROMuser_sign AS us1LEFT JOIN ( SELECT UNIX_TIMESTAMP( min( date ) ) AS min_timestamp, user_id, min( date ) AS min_date FROM user_sign GROUP BY user_id ) AS us2 ON us1.user_id = us2.user_id ORDER BYus1.user_id ASC,us1.date ASC ) AS t1,( SELECT @rownum := 0 ) AS t2 GROUP BYuser_id,type HAVINGnum > 6
这里查询的是全表里连续超过3次打卡的,并把日期展示出来。
查询的思路是:
提取出全表用户每次打卡记录与第一次打卡记录的差值但按用户与日期正排序
增加一个局部变量rownum与上面查询数据进行连查
在结果字段集里使用日期差值减去自增顺序行号值得到连续差块
通过分组用户与连续差块获取连续签到次数
通过having来提取超过6次签到的用户
看完Mysql连续数据查询的简单方法这篇文章后,很多读者朋友肯定会想要了解更多的相关内容,如需获取更多的行业信息,可以关注我们的行业资讯栏目。
数据
用户
查询
差值
日期
顺序
行号
打卡
生成
数据查询
方法
相同
内容
变量
就是
局部
时间
更多
行业
肯定
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
四线城市的软件开发公司
金山区购买网络技术开发材料
期货公司的网络安全
社会如何确保网络安全
php多服务器管理系统
server数据库集群
路由服务器时间会影响电脑时间吗
国产大带宽服务器
大悦城的公共网络安全吗
服务器监控王
数据库检测
服务器语言编写
软件开发 座右铭
软件开发部门总结开头
数据库安全的第一道保障是
服务器可以连接光纤吗
广联达软件服务器怎么安装
物种信息查询数据库
数据库信息用英语怎么说
互联网数据库架构
数据库预编译代码
数据库技术基础 视频
山西指纹数据库
美国网络安全怎么建
十大网络安全市值
云计算培训 网络安全linux
软件开发产品生产计划
宿城区工业网络技术是什么
北京智能软件开发询问报价
奋威我要安全网络安全平台