Mysql连续数据查询的简单方法
发表于:2024-11-30 作者:千家信息网编辑
千家信息网最后更新 2024年11月30日,下面一起来了解下Mysql连续数据查询的简单方法,相信大家看完肯定会受益匪浅,文字在精不在多,希望Mysql连续数据查询的简单方法这篇短内容是你想要的。顺序行号 - 减首差值 = 连续差块顺序行号 如
千家信息网最后更新 2024年11月30日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安全错误
数据库的锁怎样保障安全
租用服务器公司
广州软件开发投入标准
赛比安软件开发
自建动态域名服务器
贵州网络软件开发定制怎么样
数据库中有哪几种表
山东任务态势系统软件开发
网络安全审查 修订
区块狗app软件开发
查询服务器时间
我的世界活塞君的服务器密码
代理服务器是干嘛的
可以免费使用的云服务器
注意网络安全当心被骗英语
成都计算机应用软件开发定做
数据库去空值
永州市网络安全培训
交换机网络安全告警
opc服务器的安全设置
上海市梵讯网络技术有限公司
山东华云网络技术公司
重庆大学数据库管理及应用
考试题面向对象数据库
数据库加密安全软件
网络安全讲演
交通传感器网络技术的原理
软件开发离职交接说明
mc 多世界服务器
软件开发高级工程师满分多少分
pdu服务器电源生产厂家