mysql根据查询结果连续序号

文章讨论了如何使用SQL查询(如`SET@rownum=0;SELECT@rownum:=@rownum+1as序号,a.*FROMusera`)在业务数据中非连续ID的情况下,为Excel导出提供连续的序号序列。

业务数据一般都不是连续的ID,导出Excel的时候要求连续序号

set @rowNum=0;
SELECT @rowNum:=@rowNum+1 as `序号`,a.* from user a

MySQL 中获取“序号”(类似于行号或自增编号),可以使用 **窗口函数 `ROW_NUMBER()`**,这是最常用且高效的方式。MySQL 从 **8.0 版本开始支持窗口函数**。 --- ### ✅ 一、使用 `ROW_NUMBER()` 获取序号(推荐) ```sql SELECT ROW_NUMBER() OVER (ORDER BY id) AS row_num, id, name, age FROM users; ``` #### 输出示例: | row_num | id | name | age | |---------|-----|-------|-----| | 1 | 101 | Alice | 24 | | 2 | 102 | Bob | 30 | | 3 | 103 | Charlie | 28 | > 这里的 `row_num` 就是按 `id` 排序后生成的连续序号。 --- ### ✅ 二、其他常见的排序方式 #### 1. 按多个字段排序生成序号 ```sql SELECT ROW_NUMBER() OVER (ORDER BY department, salary DESC) AS rank_no, name, department, salary FROM employees; ``` 👉 先按部门分组,再按薪资降序排列并编号。 #### 2. 分组内编号:使用 `PARTITION BY` ```sql SELECT department, name, salary, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank FROM employees; ``` #### 输出示例: | department | name | salary | dept_rank | |------------|--------|--------|-----------| | IT | Alice | 9000 | 1 | | IT | Bob | 8000 | 2 | | HR | Carol | 7000 | 1 | | HR | Dave | 6000 | 2 | > 每个部门内部独立编号。 --- ### ⚠️ 三、MySQL 5.7 及以下版本不支持窗口函数怎么办? 由于 MySQL < 8.0 不支持 `ROW_NUMBER()`,你可以使用 **用户变量(User Variables)** 来模拟序号: #### ❗ MySQL 5.7 兼容写法:使用变量生成序号 ```sql SELECT @row_number := @row_number + 1 AS row_num, id, name, age FROM users, (SELECT @row_number := 0) AS t ORDER BY id; ``` 📌 注意: - `(SELECT @row_number := 0)` 初始化变量。 - 必须配合 `ORDER BY` 使用,否则顺序不确定。 - 在复杂查询中可能不稳定,建议升级到 MySQL 8.0+。 --- ### ✅ 四、如果只需要“前 N 条带序号”的数据? 结合 `LIMIT` 使用: ```sql SELECT ROW_NUMBER() OVER (ORDER BY score DESC) AS rank, name, score FROM students ORDER BY score DESC LIMIT 10; ``` --- ### ✅ 五、常见用途总结 | 需求 | SQL 写法 | |------|---------| | 简单行号 | `ROW_NUMBER() OVER (ORDER BY 列)` | | 分组内排名 | `ROW_NUMBER() OVER (PARTITION BY 组字段 ORDER BY 排序列)` | | Top-N 查询 | 加上 `LIMIT N` | | 分页加序号 | 在外层查询中添加 `ROW_NUMBER()` | --- ### 🚫 错误做法示例(不要这样做) ```sql -- ❌ 错误!不能保证序号连续或正确 SELECT @i:=@i+1, * FROM users; -- 缺少变量初始化和 ORDER BY,结果不可靠 ``` --- ### ✅ 补充:`ROW_NUMBER()` vs `RANK()` vs `DENSE_RANK()` | 函数 | 说明 | 示例(分数:90,90,80) | |------|------|------------------------| | `ROW_NUMBER()` | 连续编号,相同值也不同号 | 1,2,3 | | `RANK()` | 相同值同名次,跳过后续名次 | 1,1,3 | | `DENSE_RANK()` | 相同值同名次,不跳过 | 1,1,2 | ```sql SELECT name, score, ROW_NUMBER() OVER w AS row_num, RANK() OVER w AS rank_num, DENSE_RANK() OVER w AS dense_rank_num FROM students WINDOW w AS (ORDER BY score DESC); ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值