Mysql连续数据查询的简单方法
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,下面一起来了解下Mysql连续数据查询的简单方法,相信大家看完肯定会受益匪浅,文字在精不在多,希望Mysql连续数据查询的简单方法这篇短内容是你想要的。顺序行号 - 减首差值 = 连续差块顺序行号 如
千家信息网最后更新 2025年01月23日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安全错误
数据库的锁怎样保障安全
最新软件开发规范
联盟总是黑屏登不上服务器
剑网三怀旧服有哪些服务器
软件开发期间年底该不该辞职
网络安全三年级小报
中山流水线点胶软件开发
软件开发上下游关联行业
网络安全法十件事件
mfc 数据库 表格
lol手游怎么进国服服务器
wpf调用数据库
小雨网络安全手抄报
json 替代部分数据库
sql 修改数据库
多个数据库同步
c 窗体修改删除更新数据库
校园安全日网络安全总结
网络安全的5个基本要素
数据库查询事务id
dm数据库和瀚高数据库
我国快递业数据库
读秀数据库中的检索技术
数据库中输入什么字符是返回
如何制作网络安全黑板报
赚客网络基础软件开发
计算机网络技术网络工程方面
廊坊酷商网络技术有限公司
web后端_软件开发工程师
鹤壁市锦腾互联网科技有限公司
医美大数据库