SELECT (@i :=@i + 1)和(SELECT @i := 0)在sql里什么含义

博主在续写代码时,发现xml里一段含不常用函数的sql。查询得知,SELECT (@i :=@i + 1)用于生成自增序列号字段,SELECT @i := 0用于初始化,使每次查询序列号从1开始。文中还给出了相关使用案例。

今天接着别人的代码写,发现xml里这样一段sql,里面有不常用的函数:

 <select id="getStringAuditBpm" resultMap="CqProjectAuditBpmVo">
        SELECT
            c.process_node_code,
            c.process_node_name,
            ( @i := @i + 1 ) AS serial_number
        FROM
            ext_act_flow_data a,
            ext_act_process b,
            ext_act_process_node c,
            ( SELECT @i := 0 ) AS itable
        WHERE
            a.form_data_id = #{id}
          AND a.process_key = b.process_key
          AND b.id = c.process_id
        ORDER BY c.id ASC;
    </select>

我查了一下其中 SELECT (@i :=@i + 1) (SELECT @i := 0) 的用法

SELECT (@i :=@i + 1)  是为了生成自增的序列号字段

SELECT @i := 0 是为了将i进行初始化每次查询的序列号都会从1开始进行排序生成序列号

案例:
       1、

SELECT  (@i :=@i + 1) AS i,         d.pkid,d.createTime,d.updateTime,d.date,d.employeeNum         ,d.serviceNum,d.serviceGodNum,d.serviceProjectNum         ,d.totalAmount,d.avgProject,d.avgAmount,d.empForNum

,d.storeId,d.isValid,s.name as storeName

FROM daily d,store s,(SELECT @i := 0) AS it        

WHERE d.isValid=1 and s.pkid=d.storeId    

 

2、

 SELECT
            c.process_node_code,
            c.process_node_name,
            ( @i := @i + 1 ) AS serial_number
        FROM
            ext_act_flow_data a,
            ext_act_process b,
            ext_act_process_node c,
            ( SELECT @i := 0 ) AS itable
        WHERE
            a.form_data_id = #{id}
          AND a.process_key = b.process_key
          AND b.id = c.process_id
        ORDER BY c.id ASC;

 

### `SELECT @i := @i + 1` 在 MySQL 中的作用使用方法 在 MySQL 中,`SELECT @i := @i + 1` 是一种利用用户变量实现行号或计数器的常见方式。通过这种方式,可以在查询结果中生成递增的序号,通常用于模拟 `ROW_NUMBER()` 功能,这在没有窗口函数支持的 MySQL 版本中非常有用 [^2]。 #### 变量初始化 在使用变量之前,通常需要对其进行初始化。例如,`SELECT @i := 0` 将变量 `@i` 设置为 0,这样在后续的查询中可以作为起始值进行递增操作 [^1]。 ```sql SELECT @i := 0; ``` #### 行号生成 在实际查询中,可以将变量与 `SELECT` 语句结合使用,以生成递增的行号。例如: ```sql SELECT (@i := @i + 1) AS row_number, surname, personal_name FROM student, (SELECT @i := 100) AS init; ``` 在这个查询中,`@i` 被初始化为 100,并在每一行中递增 5,从而生成从 100 开始的行号 [^2]。 #### 条件行号生成 在某些情况下,可能需要根据特定条件生成行号。例如,当按部门分组时,可以使用 `IF` 函数来实现按组计数: ```sql SELECT *, @count := IF(@pre = dept_id, @count + 1, 1) AS cout_num, @pre := dept_id AS pre FROM employee, (SELECT @count := 0, @pre := NULL) v; ``` 在这个查询中,`@count` 变量根据 `@pre` 变量是否等于当前 `dept_id` 来决定是否重置计数器。如果 `dept_id` 改变,则计数器重置为 1,否则递增 1 [^3]。 #### 使用注意事项 - **变量作用域**:用户变量在整个会话中是全局的,因此在多个查询中使用时需要注意其值的持久性。 - **排序问题**:如果希望生成的行号基于某种排序,必须使用 `ORDER BY` 明确指定排序规则,否则行号可能不会按预期生成。 - **性能问题**:在处理大数据集时,使用变量可能会导致性能下降,因此应谨慎使用并进行性能测试。 --- ### 示例代码 以下是一个完整的示例,展示如何在 MySQL 中使用变量生成行号: ```sql SELECT (@i := @i + 1) AS row_number, surname, personal_name FROM student, (SELECT @i := 100) AS init ORDER BY surname; ``` 在这个查询中,`@i` 被初始化为 100,并在每一行中递增 1,生成从 100 开始的行号,同时按 `surname` 排序 。 --- ### 相关问题 1. MySQL 中如何实现基于分组的行号生成? 2. 在 MySQL 中,使用变量生成行号时如何确保排序正确? 3. 如何在 MySQL 中使用变量实现类似于 `ROW_NUMBER()` 的功能? 4. MySQL 中使用用户变量生成行号的性能影响是什么? 5. 如何在 MySQL 中使用变量实现分页查询?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值