假设我们有一个文章系统,每个文章都可以被留言。
留言据保存在 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;