Mysql连续数据查询的简单方法
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,下面一起来了解下Mysql连续数据查询的简单方法,相信大家看完肯定会受益匪浅,文字在精不在多,希望Mysql连续数据查询的简单方法这篇短内容是你想要的。顺序行号 - 减首差值 = 连续差块顺序行号 如
千家信息网最后更新 2026年11月02日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安全错误
数据库的锁怎样保障安全
互联网科技公司经营范围
高科技与互联网
互联网科技英文
成都互联网科技公司
奔汉互联网科技
友谊互联网络科技
昭通云南众福互联网科技有限公司
现代互联网科技股
互联网软件和科技
阿大互联网科技有限公司
互联网科技研发水平
迪庆互联网科技招生
玉溪新华互联网科技好不好
互联网时代科技型公司的机会
国产互联网科技公司
易租星互联网科技有限公司
悟空问答互联网科技
长沙易易互联网科技有限公司
东风日产互联网科技公司叫什么
中国主要互联网科技公司
互联网与科技发展
紫鲸互联网科技
善班互联网科技有限公司
深圳前海聚择互联网科技有限公司
顶级互联网科技成果有哪些
移动互联网科技股
金融科技与互联网金融相同和不同
互联网行业科技股
雨阳互联网卡科技有限公司
广州全民伙伴互联网科技有限公司