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