前言:
同事的業務場景是,按照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