MySQL-排序再记

这里整理下在MySQL中排序的方法

我就记得在哪儿写过,刚刚一直没找着,就又整理了一下,后来找到了,坑
之前的博客:MySQL-分组排序

序号

在MySQL中,没有什么row_number(),rank() 之类的开窗函数,我们想要显示数据行号的话,要使用变量来手动排序
关于变量可以参考之前的博客:MySQL-变量的使用

set @r:= 0;
select @r,@r:=@r+1,@r:=@r+1
MySQL-排序再记_第1张图片

这里呢,我们先使用set对@r变量进行了初始化,不初始化的话,变量默认为NULL,

set @r:= 0;
select @r,@r:=@r+1,@r:=@r+1,@k,@k:=@k+2
MySQL-排序再记_第2张图片

因为我们使用的用户自定义变量,只在当前会话窗口有效,换个窗口就不行了;同样的,如果不初始化为0,他会继续使用上次的值

MySQL-排序再记_第3张图片

所以,我们要给数据显示序号的话,就需要使用这个变量

select 
    a.*,
    @row_num:=@row_num+1 as row_num 
from 
    t_student a , (select @row_num:=0) b  
order by 
    s_id

我们在表b中初始化序号变量,表a表b没有关联关系,直接产生笛卡尔积,因为记录是按行返回的,所以每行记录都会产生一个序号,每行记录按照@row_num:=@row_num+1进行赋值
这里就和SQL的执行顺序有关,要好好领会一下

MySQL-排序再记_第4张图片

用下面的方式也可以

set @row_num:=0;
select 
    a.*,
    @row_num:=@row_num+1 as row_num 
from 
    t_student a 
order by 
    s_id

分组排序

上面,我们就简单的实现了序号,有时候,我们需要实现更复杂的分组排序


set @row_num:=1;
set @pre_c_id:=null;
select 
    a.*,
    if(@pre_c_id=c_id,@row_num:=@row_num+1,@row_num:=1) as row_num,
    @pre_c_id:=c_id
    -- @row_num:=@row_num+1 as row_num 
from 
    t_student a 
order by 
    c_id,s_id

因为我们要看分组的序号,所以,我们得知道当前记录的c_id和上一条记录的c_id是否一样,一样继续序号,不一样,就要重新开始编号了。
后面就参考前面的文章吧。
MySQL-分组排序

你可能感兴趣的:(MySQL-排序再记)