2019独角兽企业重金招聘Python工程师标准>>>

给单表查询结果添加一列表示名次(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 主任务ID integer   qw_game_section default: 0
name 子任务名 string     default: ""
description 任务介绍信息 text      
task_num 子任务的排序编号 integer 同一section_id task_num小的排在前面   default: 0
status 子任务状态 boolean     default: false
editor_id 编辑用户ID integer     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

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

  1. mysql连接查询(两个表内和多个表内连接查询)

    连接是关系数据模型的主要特点,连接查询是关系数据库中最主要的查询,包括内连接.外连接等. 当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行 连接查询,得到存放在多个表中的记录数据 ...

  2. mysql合并查询结果及为表和字段取别名

    利用union关键字,可以给出多条select语句,并将它们的结果组合成单个的结果. 合并是,两个表对应的列数和数据类型必须相同. 各个select语句之间使用union或union all关键字分隔 ...

  3. MySQL给查询结果添加序号列的书写格式

    一.给查询结果添加序号列的方法 1.方法一 set @counter=0; SELECT @counter:=@counter+1 as rank,t.s_score FROM score t 2.方 ...

  4. mysql 分组查询大于1_MySQL 一表分组查询max

    一个很常见的较为复杂的查询,在同一张表里求某个分组下某个属性最高的前N位记录,主要有两种方法实现,这里详细说明一下. 假设一张表记录了员工,薪水和部门Id +----+-------+-------- ...

  5. 记Mysql同时查询更新同一张表的操作

    直接查询修改同一张表会报错,这里换个思路,想办法变成是对两张表进行操作就能解决问题啦! UPDATE test SET IState=11 WHERE Id in (SELECT Id FROM (S ...

  6. mysql 查看某数据库中所有表的行数,information_schema.tables不准确。count(*)拼接准确。

    mysql使用information_schema.tables统计表的行数,统计结果和count(*)的结果不一样. select table_name,table_rows from inform ...

  7. MySQL数据库与Oracle数据库中建表使用单引号和双引号的效果

    一.Oracle数据库,使用单引号和双引号,以及不使用引号的区别 1.不使用引号,创建一个新表 -- 如果不使用引号,则表名和字段会自动转换成大写 create table Tatoo_Test(Na ...

  8. html之table删除和添加数据(获取行号和列号)

    代码: <!DOCTYPE html> <html><head><meta charset="utf-8"><title> ...

  9. mysql 分页查询分析_mysql 大表分页查询测试分析优化

    http://blog.csdn.net/xluren/article/details/32746183 http://www.cnblogs.com/kupig/archive/2011/10/19 ...

最新文章

  1. oracle 里 符号 || 表示什么意思??
  2. NASA宣布在火星上发现了3种有机分子
  3. 如何将记事本转换.php,记事本怎么变成表格?电脑便签如何将记事内容转化成Excel表格...
  4. 被迫学计算机,电脑强迫人学习
  5. Spark Relational Cache实现亚秒级响应的交互式分析
  6. 二层交换网络_网络中的第2层交换
  7. python做审计底稿视频_最新Python教学视频,每天自学俩小时,让你offer拿到手软...
  8. pycharm 常用设置
  9. 百度地图python_python百度地图API爬取街景
  10. 三 转码需求(智源GM813X多国语言OSD开发)
  11. 等价类划分法测试用例设计
  12. 如何创建VARCHART XGantt筛选器
  13. U盘插入苹果电脑后被分区,在Windows系统用不了怎么办。
  14. iMindMap中的虚线箭头如何进行使用
  15. 论文后面的参考文献格式应该如何写
  16. flex:1 代表了什么意思
  17. 攻防世界(练习小题)
  18. 031_组件 reRender控件和rendered控件的使用
  19. NX/UG二次开发-曲线-设置2D曲线最小曲率半径
  20. 9月编程排行榜新鲜出炉霸榜还得是它~

热门文章

  1. 智慧故事----每次进来看看都会有收获
  2. “软”苹果水逆的一周:杂志服务崩溃,新机型遭泄露,芯片首架离职
  3. 创业邦30岁以下青年企业家峰会暨颁奖典礼在京举行
  4. 调整Virtual Box硬盘大小
  5. SCCM 2012系列14 操作系统播发③
  6. vsftp tomcat jdk
  7. Codeforces Round #371 (Div. 2) C. Sonya and Queries 水题
  8. [JBoss] JNDI与JBossNS
  9. C++中include头文件使用与的区别
  10. PTA : 函数题 7-3 两个有序链表序列的交集 (20 分)