sql-實現select取行號、分組后在分組內排序、每個分組中的前n條數據


表結構設計:

實現select取行號

sql局部變量的2種方式

  • set @name='cm3333f';
  • select @id:=1;

區別:set 可以用=號賦值,而select 不行,必須使用:=

方法1:

由上述可得出,我們可以通過局部變量的方式來獲取行號,sql如下:

set @rownum=0:
select pname,ptype,pview,@rownum:=@rownum+1 from test order by pname desc,pview desc ;

可實現,但需要給他先設置局部變量,在實際項目應用中,不方便

由此得出進階版本:

select pname,ptype,pview,IFNULL(@rownum:=@rownum+1,@rownum:=1) from test order by pname desc,pview desc ;

不可實現,每次執行時,@rownum不斷疊加,行號不對,

最終版本:

select pname,ptype,pview,@rownum:=@rownum+1 from test a,(select @rownum:=0) b order by pname desc,pview desc ;

可實現,@rownum每次執行時都為0

 ps:

  1. from 表名,要寫別名
  2. from后邊是select
  3. from 2個表無需關聯關系

分組后在分組內排序

先根據類型排序,在根據點擊率排序

select ptype,pname,pview from test order by ptype desc,pview desc;

每個分組中的前n條數據

IF表達式

IF(expr1,expr2,expr3)

如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),則 IF()的返回值為expr2; 否則返回值則為 expr3。IF() 的返回值為數字值或字符串值,具體情況視其所在語境而定。

select ptype,pname,pview,if(@bak=ptype,@rownum:=@rownum+1,@rownum:=1) as num,@bak:=ptype
 from
 (select ptype,pname,pview from test order by ptype desc,pview desc) a,  (select @rownum:=0,@bak:='') b;

so,該sql得出的結果是 顯示排序后的所有數據且給他他們標記好了num

取出前2條的完整sql:

select ptype,pname,pview,num from
    (select ptype,pname,pview,if(@bak=ptype,@rownum:=@rownum+1,@rownum:=1) as num,@bak:=ptype
 from
 (select ptype,pname,pview from test order by ptype desc,pview desc) a,  (select @rownum:=0,@bak:='') b) c where c.num<=2;


免責聲明!

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



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