mysql使用自定义变量模拟分析函数,初始化实验结构和数据:
create table test(
tid varchar(32) primary key,
stat int not null,
createtime timestamp not null
);
insert into test (tid,stat,createtime) values ('ac551ad7ba3f9067b19ac8bb20caca6d',-1,'2014-08-20 10:01:09');
insert into test (tid,stat,createtime) values ('dc9a4438e577f4b08f7033a305544d47',-1,'2014-08-20 10:00:19');
insert into test (tid,stat,createtime) values ('23055228532bbba5a68d6ada11bcf33f',-1,'2014-08-20 09:58:32');
insert into test (tid,stat,createtime) values ('5711ee1610d07a55e64c7948667de6e8',-1,'2014-08-20 09:58:09');
insert into test (tid,stat,createtime) values ('035e06d8afd681a9904bd74e9860f8cb',-1,'2014-08-20 09:57:52');
insert into test (tid,stat,createtime) values ('3890efc08f37fa489a4e130cb04f71ac',-1,'2014-08-20 09:57:48');
insert into test (tid,stat,createtime) values ('1b6ed9db663dae470b45c722a61d08b0',-1,'2014-08-20 09:56:40');
insert into test (tid,stat,createtime) values ('8fb3409015e6b2cf85ba6ee90f15b58f',-1,'2014-08-20 09:54:40');
insert into test (tid,stat,createtime) values ('0badb1f4c2b1a89f1c473b992183add3',-1,'2014-08-20 09:54:33');
insert into test (tid,stat,createtime) values ('89b8af5eb473b2d4f50dd9e10773a9cc',-1,'2014-08-20 09:53:54');
insert into test (tid,stat,createtime) values ('77923a7397110224b5f94e7d0bd297de',2,'2014-08-19 17:13:17');
insert into test (tid,stat,createtime) values ('0df1da77cfdbe64edcd4d645197174af',2,'2014-08-19 12:20:21');
insert into test (tid,stat,createtime) values ('43daef6bfbc46dbfdbb97e74173dab30',2,'2014-08-19 09:54:08');
insert into test (tid,stat,createtime) values ('d5d12c510391314f48054c6c9ab9535c',2,'2014-08-19 09:23:41');
insert into test (tid,stat,createtime) values ('f7c123143752498b7c9a226a9583ae49',2,'2014-08-19 01:14:21');
insert into test (tid,stat,createtime) values ('da6a9a78897a42ae0a565cd0fabd76bb',2,'2014-08-18 21:59:46');
insert into test (tid,stat,createtime) values ('9cd3f83ab04120504a880523702491d7',2,'2014-08-18 16:26:30');
insert into test (tid,stat,createtime) values ('4dfa129ba64e7062afa37e56bb9632de',2,'2014-08-18 14:32:41');
insert into test (tid,stat,createtime) values ('a9a731870e1c02278c22ce1ab36fa43c',2,'2014-08-18 14:31:26');
insert into test (tid,stat,createtime) values ('97f39d2a1e519f99e602e72cfc45fe0c',2,'2014-08-17 11:47:52');
insert into test (tid,stat,createtime) values ('31ba95265a96971221ddf9320c79eed8',3,'2014-08-20 02:08:50');
insert into test (tid,stat,createtime) values ('060d92222edcb6f583cb4cd0244aadc0',3,'2014-08-20 02:05:54');
insert into test (tid,stat,createtime) values ('7d3eb4ea201906b08e961b9fe7726fd4',3,'2014-08-20 02:00:11');
insert into test (tid,stat,createtime) values ('c633bc16cb8c3bb4ffa7f00682701b92',3,'2014-08-20 01:54:22');
insert into test (tid,stat,createtime) values ('e43bb7e7274259712b389e3feabc068f',3,'2014-08-20 01:49:36');
insert into test (tid,stat,createtime) values ('bdabf3d80fb097222112cb30cdc48117',3,'2014-08-20 01:48:48');
insert into test (tid,stat,createtime) values ('170e2bdc11d517a56b7ce23d85633e42',3,'2014-08-20 01:46:56');
insert into test (tid,stat,createtime) values ('7e79f6065ae8bb215cee43a4efbcd852',3,'2014-08-20 01:44:17');
insert into test (tid,stat,createtime) values ('04728676e3305de05a18333ddfc76c01',3,'2014-08-20 01:39:05');
insert into test (tid,stat,createtime) values ('d987176d350d4fefcc92b9a7ebb4f288',3,'2014-08-20 01:35:52');
commit;
要求:
stat表示状态,createtime表示创建时间
查询每种状态最近3个记录的内容
这个需求似曾相识
但是这回是mysql数据库了。他没有分析函数,只能用自定义变量模拟
test表的stat字段为分组标识
gid是上一个记录的分组标识,
cgid是当前记录的分组标识,
如果gid和cgid不等,,说明分组标识已经变了,rank排序重置
这样rank是按照每个分组进行自增的,取前n个记录就可以了。
select t3.tid, t3.stat, t3.createtime
from (select @gid := @cgid, @cgid := t1.stat, if(@gid = @cgid, @rank := @rank + 1, @rank := 1) as rank, t1.*
from (select *
from test
order by stat, createtime desc
) t1, (select @gid := 1, @cgid := 1, @rank := 1) t2
) t3
where t3.rank 结果:
mysql实现每个分组随机抽取n个记录的功能
(前面链接中的功能)
select t3.tid, t3.stat, t3.createtime
from (select @gid := @cgid, @cgid := t1.stat, if(@gid = @cgid, @rank := @rank + 1, @rank := 1) as rank, t1.*
from (select *
from test
order by stat, rand()
) t1, (select @gid := 1, @cgid := 1, @rank := 1) t2
) t3