mysql 實現類似開窗函數的功能


mysql8 已經支持開窗函數 https://dev.mysql.com/doc/refman/8.0/en/window-functions.html

————————————————

sql server 的開窗函數

http://www.cnblogs.com/zihunqingxin/p/3638857.html

 

mysql8 之前的版本不支持開窗函數

 

目的,取每個channel 按created_on 倒序排的前20條

 

示例如下(有部分冗余數據)

select id,url,channel,created_on,rank 
from(
    select id,url,channel,created_on,rank 
    from (select article_tmp.id,url,article_tmp.channel,article_tmp.created_on,@rownum:=@rownum+1 ,
          if(@pdept=article_tmp.channel,@rank:=@rank+1,@rank:=1) as rank,
          @pdept:=article_tmp.channel
          from (
                select id,url,channel,created_on 
                from article order by channel asc ,created_on desc
               ) article_tmp ,
               (select @rownum :=0 , @pdept := null ,@rank:=0) a 
    ) result
)t where rank<=20;

 

最核心的部分是

select article_tmp.id,url,article_tmp.channel,article_tmp.created_on,@rownum:=@rownum+1 ,
          if(@pdept=article_tmp.channel,@rank:=@rank+1,@rank:=1) as rank,
          @pdept:=article_tmp.channel
          from (
                select id,url,channel,created_on 
                from article order by channel asc ,created_on desc
               ) article_tmp

 

原理是按channel 和 created_on 排序

兩個臨時變量

pdept

rank

pdept 指向channel

 

游標(這么說不准確,就是個遍歷的過程)下移的過程中

pdept 未變,則rank++

若pdept 變化,則表示是新的channel  rank歸0 

 

最后按取rank 的top N條數據 即可

select article_tmp.id,url,article_tmp.channel,article_tmp.created_on,@rownum:=@rownum+1 ,
          if(@pdept=article_tmp.channel,@rank:=@rank+1,@rank:=1) as rank,
          @pdept:=article_tmp.channel
          from (
                select id,url,channel,created_on 
                from article order by channel asc ,created_on desc
               ) article_tmp


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM