表結構設計:html
sql局部變量的2種方式sql
set @name='cm3333f';
select @id:=1;
區別:set 能夠用=號賦值,而select 不行,必須使用:=spa
由上述可得出,咱們能夠經過局部變量的方式來獲取行號,sql以下:設計
set @rownum=0:
select pname,ptype,pview,@rownum:=@rownum+1 from test order by pname desc,pview desc ;
可實現,但須要給他先設置局部變量,在實際項目應用中,不方便code
由此得出進階版本:htm
select pname,ptype,pview,IFNULL(@rownum:=@rownum+1,@rownum:=1) from test order by pname desc,pview desc ;
不可實現,每次執行時,@rownum不斷疊加,行號不對,blog
最終版本:排序
select pname,ptype,pview,@rownum:=@rownum+1 from test a,(select @rownum:=0) b order by pname desc,pview desc ;
可實現,@rownum每次執行時都爲0字符串
ps:class
先根據類型排序,在根據點擊率排序
select ptype,pname,pview from test order by ptype desc,pview desc;
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;
原文出處:https://www.cnblogs.com/8013-cmf/p/11157945.html