创建一张测试数据表,模拟MySQL5.7 全表排序加序号和分组排序加序号
sql
CREATE TABLE `zm_one` (
`id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT 'id',
`dept_code` varchar(255) DEFAULT NULL COMMENT '部门编码',
`dept_name` varchar(255) DEFAULT NULL COMMENT '部门名称',
`emp_code` varchar(255) DEFAULT NULL COMMENT '员工编码',
`emp_name` varchar(255) DEFAULT NULL COMMENT '员工姓名',
`sale_amount` decimal(10,2) DEFAULT NULL COMMENT '销售金额',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4;
表数据如下:

测试如下条件:
1 全表排序,按照销售金额从大到小排序,添加序号;
2 全表排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同;
3 全表排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同,后续序号发生跳跃;
4 分组排序,按照销售金额从大到小排序,添加序号;
5 分组排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同;
6 分组排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同,后续序号发生跳跃;
一 条件1
全表排序,按照销售金额从大到小排序,添加序号:
查询sql:
sql
select dept_name, emp_name, sale_amount, (@row_order := @row_order + 1) as row_index
from
(select dept_name, emp_name, sale_amount from zm_one order by sale_amount desc) a,
(select @row_order := 0) b
查询结果:

二 条件2
全表排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同:
查询sql:
sql
select
dept_name, emp_name, sale_amount, row_number
from
(select
dept_name, emp_name, sale_amount,
@row_order := IF(@pre_val = sale_amount, @row_order, @row_order + 1) as row_number,
@pre_val := sale_amount
from
(select dept_name, emp_name, sale_amount from zm_one order by sale_amount desc) a,
(select @row_order := 0, @pre_val := NULL) b
) c
查询结果:

三 条件3
全表排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同,后续序号发生跳跃:
查询sql:
sql
select dept_name, emp_name, sale_amount, row_number
from
(select
dept_name, emp_name, sale_amount,
@row_order := IF(@pre_val = sale_amount, @row_order, @row_count) as row_number,
@pre_val := sale_amount,
@row_count := @row_count + 1
from
(select dept_name, emp_name, sale_amount from zm_one order by sale_amount desc) a,
(select @row_order := 0, @row_count := 1, @pre_val := NULL) b
) c
查询结果:

四 条件4
分组排序,按照销售金额从大到小排序,添加序号:
查询sql:
sql
select dept_name, emp_name, sale_amount, row_number
from
(select dept_code, dept_name, emp_name, sale_amount, @row_order := IF(@group_val = dept_code, @row_order + 1, 1) as row_number, @group_val := dept_code
from
(select dept_code, dept_name, emp_name, sale_amount from zm_one order by dept_code, sale_amount desc) a,
(select @row_order := 0, @group_val := NULL) b
) c
查询结果:

五 条件5
分组排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同:
查询sql:
sql
select dept_name, emp_name, sale_amount, row_number
from
(select dept_code, dept_name, emp_name, sale_amount, @row_order := IF(@group_val = dept_code, IF(@pre_val = sale_amount, @row_order, @row_order + 1), 1) as row_number, @group_val := dept_code, @pre_val := sale_amount
from
(select dept_code, dept_name, emp_name, sale_amount from zm_one order by dept_code, sale_amount desc) a,
(select @row_order := 0, @group_val := NULL, @pre_val := NULL) b
) c
查询结果:

六 条件6
分组排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同,后续序号发生跳跃:
查询sql:
sql
select dept_name, emp_name, sale_amount, row_number
from
(select dept_code, dept_name, emp_name, sale_amount,
@row_order := IF(@group_val = dept_code, IF(@pre_val = sale_amount, @row_order, @row_count), 1) as row_number,
@row_count := IF(@group_val = dept_code, @row_count + 1, 2),
@group_val := dept_code,
@pre_val := sale_amount
from
(select dept_code, dept_name, emp_name, sale_amount from zm_one order by dept_code, sale_amount desc) a,
(select @row_order := 0, @group_val := NULL, @row_count := 0, @pre_val := NULL) b
) c
查询结果:

使用用户自定义变量在当前会话生效,在分组排序,按照销售金额从大到小排序,添加序号,金额相同,序号相同,后续序号发生跳跃,创建了四个变量:
@row_order变量代表当前行记录的序号;
@group_val变量区分分组的字段;
@row_count变量表示下一条行记录的序号;
@pre_val变量记录当前行排序的字段,用于下一条记录的比较;