• 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;
  • 相关阅读:
    Python小白的数学建模 ---- 系列课程
    Maven学习笔记
    JavaScript 中的 Var,Let 和 Const 有什么区别
    (鸡汤文)搞懂了 JavaScript 定时器 setTimeout() 的 this 指向!
    setTimeout返回值的验证,(〒︿〒) 请原谅我一直以来对你的忽视
    终于把初中到大学的数学知识梳理完了(学习算法必备数学知识)
    最简单入门深度学习
    机器学习基本流程
    Vue.js源码解析-Vue初始化流程
    最大公约数&最小公倍数
  • 原文地址:https://www.cnblogs.com/8013-cmf/p/11157945.html
Copyright © 2020-2023  润新知