zoukankan      html  css  js  c++  java
  • mysql 实现 row_number和rank功能

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

    留言据保存在 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;

     
  • 相关阅读:
    C++类的内存结构
    emplace与insert的区别(C++11)
    C/C++宏的奇技淫巧
    编译器对内存的分配
    利用C++实现模块隐藏(R3层断链)
    PCB标准规范
    RTC 总结
    0.96寸OLED显示屏 IIC接口(SSD1306)
    串行通信简介(SPI, IIC, UART)
    人生感悟
  • 原文地址:https://www.cnblogs.com/bugY/p/2528574.html
Copyright © 2011-2022 走看看