MySQL SELECT查询结果如何正确显示逐行连续行号
问题原因
你当前语句返回的行号全为1,是对窗口函数row_number()的partition by子句逻辑理解有误:
partition by的作用是将结果集按照指定字段拆分为多个独立分区,窗口函数会在每个分区内部单独计算行号- 你写的
partition by item_num会把每个不同的item_num值单独划分为一个分区,每个分区内仅1条数据,因此所有行计算出的行号都是1
修正方案
你需要的是对整个查询结果集逐行生成连续行号,不需要使用partition by做分区拆分,根据你对行号排序稳定性的要求,选择对应写法即可:
- 仅需要返回连续行号、不要求行号对应固定排序规则
直接删除partition by子句即可:select item_num, row_number() over() as row_number from items;注意:MySQL官方明确说明,窗口函数不指定
order by时,返回的行号顺序不做稳定性保证,可能随数据存储位置、执行计划变化而变动。 - 需要固定行号的排序逻辑(推荐)
在窗口函数内增加order by子句明确排序规则,生成的行号结果稳定可预期:- 若要按照
item_num字段升序排列生成行号:select item_num, row_number() over(order by item_num) as row_number from items; - 若要按照数据原始插入顺序生成行号,可使用表内的自增主键(通常命名为
id)作为排序依据:select item_num, row_number() over(order by id) as row_number from items;
- 若要按照
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

