无需升级MySQL 5.6,如何替代ROW_NUMBER() OVER生成行号列?
MySQL 5.6 生成带行号的RNO列解决方案
MySQL 5.6 不支持 ROW_NUMBER() OVER() 这类窗口函数,要实现和PostgreSQL/Oracle中相同的带行号RNO列功能,可以通过用户自定义变量来实现,具体写法如下:
基础实现写法
SELECT @rno := @rno + 1 AS RNO, subQuery.* FROM ( SELECT * FROM $TableName ) AS subQuery, (SELECT @rno := 0) AS init_var
匹配原语句嵌套结构的写法
如果需要和你原本的嵌套查询结构完全一致(外层包裹为newTable),可以写成:
(SELECT @rno := @rno + 1 AS RNO, subQuery.* FROM $TableName subQuery, (SELECT @rno := 0) AS init_var) AS newTable
关键说明
(SELECT @rno := 0)用于初始化会话变量@rno,确保每次查询开始时行号从1开始计数,避免会话残留值干扰结果。- 原语句中
ORDER BY NULL表示不指定排序规则,上述写法的行号会按照数据的自然读取顺序生成,和原逻辑完全匹配;如果需要指定排序,只需在子查询$TableName后添加ORDER BY子句即可(例如SELECT * FROM $TableName ORDER BY id)。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

