MySQL-排序再记

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

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

序号

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

1
2
set @r:= 0;
select @r,@r:=@r+1,@r:=@r+1

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

1
2
set @r:= 0;
select @r,@r:=@r+1,@r:=@r+1,@k,@k:=@k+2

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

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

1
2
3
4
5
6
7
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的执行顺序有关,要好好领会一下

用下面的方式也可以

1
2
3
4
5
6
7
8
set @row_num:=0;
select
a.*,
@row_num:=@row_num+1 as row_num
from
t_student a
order by
s_id

分组排序

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

1
2
3
4
5
6
7
8
9
10
11
12
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-分组排序

于贵洋 wechat
要教我弹吉他嘛!