表结构设计: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