MySQL中(SELECT @rn:=0) t2表关联作用的技术疑问
MySQL查询中变量初始化与交叉连接的作用解析
1. (SELECT @rn:=0) t2 如何重置rn变量
MySQL里的用户变量(比如@rn)是和当前数据库会话绑定的,一旦赋值后,只要会话没结束,变量就会保留之前的数值。
这里的(SELECT @rn:=0) t2是个临时派生表,它只返回一行数据,核心作用是在整个查询开始执行时就把@rn初始化为0。因为当t1和t2做关联时,这个派生表的初始化语句会先执行,确保计算排名前@rn处于0的初始状态。
要是去掉t2,第一次执行查询可能结果正常,但同一个会话里再执行的话,@rn会从上一次结束的数值开始累加——比如第一次查完@rn是15,第二次就会从16开始算排名,而不是重新从1开头,结果就出错了。
2. t1, t2这种关联的实际作用
这里的逗号分隔是MySQL旧版的**交叉连接(CROSS JOIN)**写法,和FROM t1 CROSS JOIN t2是同一个意思。
因为t2只有一行数据,交叉连接后t1的每一行都会和t2的这一行配对,最终结果集的行数和t1完全一致,不会多出额外的行。但关键是通过这种方式,把变量初始化的逻辑塞进了查询的FROM子句里,不用单独先执行SET @rn:=0;这种前置命令,就能保证每次执行查询时变量都是从0开始的初始状态,把初始化和排名计算整合到了一个查询里。
内容的提问来源于stack exchange,提问作者gmmk
相关产品推荐
相关产品推荐

