MySQL使用自定义变量模拟分析函数(二)

2014-11-24 17:15:12 · 作者: · 浏览: 2
('04728676e3305de05a18333ddfc76c01',3,'2014-08-20 01:39:05');


INSERT INTO test (tid,stat,createtime) VALUES ('d987176d350d4fefcc92b9a7ebb4f288',3,'2014-08-20 01:35:52');


COMMIT;


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 <= 3;
结果:



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


WHERE t3.rank <= 3;

----------------------------分割线---------------------------------

上面这些都是使用MySQL自定义变量模拟分析函数,
使用传统的相关子查询也可以实现这个功能,只是效率低

SELECT t1.tid, t1.stat, t1.createtime

FROM test t1


WHERE (


SELECT COUNT(*)


FROM test t2


WHERE t2.stat = t1.stat


AND t1.createtime < t2.createtime


) < 3


ORDER BY stat, createtime DESC


--------------------------------------分割线 --------------------------------------


--------------------------------------分割线 --------------------------------------