MySQL给查询结果添加一表表示行号或名次(1)

给单表查询结果添加一列表示名次(order_no)和行号(row_no)

需求信息

有一个游戏子任务表(qw_game_task),查出该表的所有记录,并在查询结果里添加两列分别表示名次(order_no)和行号(row_no)。名次(order_no)和行号(row_no)的区别:

  1. 名次(order_no):编号从1开始,用一section_id的order_no值相同表示名次并列,递增排序;
  2. 行号(row_no):递增排序,从1开始;

数据库表结构

 qw_game_task游戏子任务   
字段名中文名字段类型备注说明关联表可选项
id表主键integer自动增长  
section_id主任务IDinteger qw_game_sectiondefault: 0
name子任务名string  default: ""
description任务介绍信息text   
task_num子任务的排序编号integer同一section_id task_num小的排在前面 default: 0
status子任务状态boolean  default: false
editor_id编辑用户IDinteger  default: 0
created_time创建时间integer   
updated_time更新时间integer   

 

查询语句

set @current_section_id = 0, @order_no:=1, @row_no = 0;
SELECT id, section_id, name, @current_section_id AS before_section_id, @row_no:=@row_no+1 AS row_no,
CASE WHEN @current_section_id <> section_id THEN @order_no:=@row_no ELSE @order_no:=@order_no END AS order_no
, @current_section_id := section_id AS after_section_id
FROM qw_game_task
ORDER BY id DESC

查询结果截图:

实现分析

  1. 行号(row_no):实现比较简单,在整个SELECT语句执行前定义一个变量@row_no并赋值为0,然后在SELECT语句里,每次自动加1就可以;
  2. 名次(order_no):比row_no稍微复杂一点,需要定义两个变量@current_section_id和@order_no。@current_section_id记录前一条记录的section_id,然后通过对比当前记录的section_id和@current_section_id是否相等来给@order_no赋值。因为我们在判断@current_section_id和sectio_id是否相等后,把当前记录的section_id赋值给@current_section_id,所以查询结果里的before_section_id和after_section_id会不同。

补充说明

1,网上有人说下面这种写法和上面的SQL语句的查询结果相同,但本人测试结果有不一样。

SELECT id, section_id, name, @current_section_id AS before_section_id, @row_no:=@row_no+1 AS row_no,
CASE WHEN @current_section_id <> section_id THEN @order_no:=@row_no ELSE @order_no:=@order_no END AS order_no
, @current_section_id := section_id AS after_section_id
FROM qw_game_task, (SELECT @current_section_id = 0, @order_no:=1, @row_no = 0) r
ORDER BY qw_game_task.id DESC;

2,如果我们只想取出查询结果里ID<=50(order_no>1,row_no >=13)的记录,无论是使用WHERE或LIMIT子语句,row_no都是从1重新开始编号(原因请见:SQL语句的执行原理分析)。

1)WHERE子语句,查询结果

2)LIMIT子语句查询结果

素材文件:链接: https://pan.baidu.com/s/1bpEJ82F 密码: ktfs

转载于:https://my.oschina.net/laifuzi/blog/861222

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值