MySQL数据库生成分组排序的序号 (mysql数据类型)
1. 数据准备
创建一个展示表
users
:
```sql
CREATE TABLE users(
id INT PRIMARY KEY,
group_id INT,
c_name VARCHAR(64)
);
```
插入展示数据:
```sql
-- 插入 10 行数据
INSERT INTO users VALUES
(1, 1, '张三'),
(2, 1, '李四'),
(3, 2, '王五'),
(4, 2, '赵六'),
(5, 3, '钱七'),
(6, 1, '周八'),
(7, 2, '吴九'),
(8, 3, '郑十'),
(9, 1, '孙十一'),
(10, 3, '李十二');
```
2. 生成序号
(1) 使用窗口函数 ROW_NUMBER() 实现
在 MySQL 8.0 中,可以使用窗口函数
ROW_NUMBER()
来生成序号:
```sql
SELECT
ROW_NUMBER() OVER (ORDER BY c_name) AS row_num,
id,
c_name
FROM users;
```
运行结果:
```
+---------+----+-----------+
| row_num | id | c_name |
+---------+----+-----------+
| 1 | 7 | 吴九 |
| 2 | 6 | 周八 |
| 3 | 9 | 孙十一 |
| 4 | 1 | 张三 |
| 5 | 10 | 李十二 |
| 6 | 2 | 李四 |
| 7 | 3 |王五 |
| 8 | 4 | 赵六 |
| 9 | 8 | 郑十 |
| 10 | 5 | 钱七 |
+---------+----+-----------+
```
(2) 低版本 MySQL 中的实现
由于在 MySQL 8.0 版本之前没有
ROW_NUMBER()
窗口函数,因此需要使用变量来实现。具体示例如下:
```sql
SET @row_num = 0;
SELECT
(@row_num := @row_num + 1) AS row_num,
id,
c_name
FROM users
ORDER BY c_name;
```
运行结果:
```
+---------+----+-----------+
| row_num | id | c_name |
+---------+----+-----------+
| 1 | 7 | 吴九 |
| 2 | 6 | 周八 |
| 3 | 9 | 孙十一 |
| 4 | 1 | 张三 |
| 5 | 10 | 李十二 |
| 6 | 2 | 李四 |
| 7 | 3 | 王五 |
| 8 | 4 | 赵六 |
| 9 | 8 | 郑十 |
| 10 | 5 | 钱七 |
+---------+----+-----------+
```
注意:每次执行前需要将
@row_num
重新设置为 0,即执行
SET @row_num = 0
。
3. 分组后排序
(1) 继续使用窗口函数 ROW_NUMBER() 实现
在 MySQL 8.0 中,可以继续使用窗口函数
ROW_NUMBER()
来实现分组排序的功能:
```sql
SELECT
id,
group_id,
c_name,
ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY id) AS row_num
FROM users
ORDER BY group_id, id;
```
运行结果:
```
+----+----------+-----------+---------+
| id | group_id | c_name | row_num |
+----+----------+-----------+---------+
| 1 | 1 | 张三 | 1 |
| 2 | 1 | 李四 | 2 |
| 6 | 1 | 周八 | 3 |
| 9 | 1 | 孙十一 | 4 |
| 3 | 2 | 王五 | 1 |
| 4 | 2 | 赵六 | 2 |
| 7 | 2 | 吴九 | 3 |
| 5 | 3 | 钱七 | 1 |
| 8 | 3 | 郑十 | 2 |
| 10 | 3 | 李十二 | 3 |
+----+----------+-----------+---------+
```
mysql5.7 mysql8窗口函数分组排序并在组内编号
表结构 ROW_NUMBER() OVER (PARTITION BY category ORDER BY id) AS idx 含义: 按 category 分组, 组内按 id 排序, 组内排序的序号(行号)作为列 idx ROW_NUMBER() 在 mysql8 才开始支持, 对于msqyl5.7或对应版本的MariaDB,相同功能的实现可以参考如下 sql 要点: 可以看到,两个结果,在分组变化的地方,idx开始了重新编号,且结果与 ROW_NUMBER() 一致.
用mysql查询后,怎样生成名次的顺序号
用mysql查询后,怎样生成名次的顺序号SELECT 语句中的 Order By 子句,决定返回记录集合的排序方式例如:按照【名次】值,从小到大排序Select * From 表名 Where By名次按照【名次】值,从大到小排序Select * From 表名 Where By名次 Desc
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。