MySQL 5.7 可以通过使用变量实现分组 row_number。实现方法如下:
SET @num := 0, @group := '';
SELECT *,
@num := IF(@group = group_col, @num + 1, 1) AS row_number,
@group := group_col AS dummy
FROM table_name
ORDER BY group_col, order_col;
其中,group_col 是要分组的列名,order_col 是排序的列名。
例如,假设有以下表格:
id | name | department |
---|---|---|
1 | Amy | HR |
2 | Bob | IT |
3 | Cate | HR |
4 | Dave | Marketing |
如果想按照 department 分组,并为每个组内的行添加一个序号,可以使用以下查询语句:
SET @num := 0, @dept := '';
SELECT *,
@num := IF(@dept = department, @num + 1, 1) AS row_number,
@dept := department AS dummy
FROM employee
ORDER BY department, name;
执行结果如下:
id | name | department | row_number |
---|---|---|---|
1 | Amy | HR | 1 |
3 | Cate | HR | 2 |
2 | Bob | IT | 1 |
4 | Dave | Marketing | 1 |
可以看到,同部门的员工被正确地分组,并且在组内根据 name 排序,同时每个组内的员工都获得了一个 row_number 序号。