博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

mysql 实现 row_number和rank功能

Posted on 2012-05-31 15:44  bug yang  阅读(2632)  评论(0编辑  收藏  举报

 

假设我们有一个文章系统,每个文章都可以被留言。

留言据保存在 comments 表中。comments表结构如下

字段名

含义

comment_id

留言id(主键)

article_id

被留言的文章的id

uid

写此留言的用户id

nickname

用户昵称

write_time

写留言的时间

 

抢沙发的定义:

给定一个开始时间 T1,结束时间 T2

如果一个留言是某文章的前5个留言,且留言时间介于T1和T2之间,则认为满足抢沙发条件(另一种等价描述:对于每篇文章的前5个留言中,其中留言时间介于T1和T2之间的留言符合抢沙发条件)。

 

要求:在给定开始时间T1和结束时间T2的情况下,统计出所有抢沙发成功的用户一共抢到多少个沙发(按抢到沙发的总数逆序排序)。例如:

用户昵称

满足抢沙发的留言总数

小明

32

小刚

25

小红

4

小白

1

小兰

1

编程过程中可以对一些外部条件作出假设(例如假设直接调用mysql查询得到结果),写出主要逻辑即可。


Select  * from (select nickname,COUNT(1) as sofa_total from


(select com.uid,com.nickname,@article_id:=article_id as article_id,


if(@article_id=article_id,@rank:=@rank+1,@rank:=1) as rank from(


(select A.uid,A.nickname,A.article_id,A.write_time from comments A


left outer join article B on B.article_id=A.article_id


where A.write_time<(B.write_time+5) order by A.article_id asc,A.write_time asc)com,(select @rank:=1,@article_id:=null)tmp)C)D


where rank<5 group by nickname)E order by sofa_total desc;