[轉] 分組排序取前N條記錄以及生成自動數字序列,相似group by後 limit

前言:

        同事的業務場景是,按照cid、author分組,再按照id倒敘,取出前2條記錄出來。

        oracle裏面能夠經過row_number() OVER (PARTITION BY cid,author ORDER BY id DESC) 表示根據cid,author分組,在分組內部根據id排序,而此函數計算的值就表示每組內部排序後的順序編號(組內連續的惟一的),而mysql數據庫就沒有這樣的統計函數,須要本身寫複雜的sql來實現。

使用動態sql來實現mysql

先構造序列號碼,引入一個@row來作rownumber
SET @row=0;SET @mid='';SELECT cid, author, @row:=@row+1 rownum FROM test ORDER BY  cid, author LIMIT 10;   

序列號碼已經出來了,再加一個@mid來進行分組,重點在於CASE WHEN @mid = author THEN @row:=@row+1 ELSE @row:=1 END rownum,表示分組的時候會自動從1計數指導這個分組數據遍歷結束。
SET @row=0;SET @mid='';SELECT cid, author,CASE WHEN @mid = author THEN @row:=@row+1 ELSE @row:=1 END rownum, @mid:=author FROM test ORDER BY cid,author DESC LIMIT 20;  

好了,再外面加一層inner JOIN 再對 rownumber 作限制 就能夠拿到目標數據了。
SET @row=0;
SET @mid='';
SELECT a.*,b.rownum FROM test a 
INNER JOIN (
SELECT cid, author, id, CASE WHEN @mid = author THEN @row:=@row+1 ELSE @row:=1 END rownum, @mid:=author MID 
FROM test 
ORDER BY cid,author,id DESC
) b ON b.author=a.author AND b.cid=a.cid AND b.id=a.id  WHERE b.rownum<3;  sql

 

親試有效哦數據庫

 


轉載於:http://blog.itpub.net/26230597/viewspace-1267325/oracle

相關文章
相關標籤/搜索