MySQL给查询结果添加一表表示行号或名次(1)
2019独角兽企业重金招聘Python工程师标准>>>
给单表查询结果添加一列表示名次(order_no)和行号(row_no)
需求信息
有一个游戏子任务表(qw_game_task),查出该表的所有记录,并在查询结果里添加两列分别表示名次(order_no)和行号(row_no)。名次(order_no)和行号(row_no)的区别:
- 名次(order_no):编号从1开始,用一section_id的order_no值相同表示名次并列,递增排序;
- 行号(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
查询结果截图:
实现分析
- 行号(row_no):实现比较简单,在整个SELECT语句执行前定义一个变量@row_no并赋值为0,然后在SELECT语句里,每次自动加1就可以;
- 名次(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)相关推荐
- mysql连接查询(两个表内和多个表内连接查询)
连接是关系数据模型的主要特点,连接查询是关系数据库中最主要的查询,包括内连接.外连接等. 当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行 连接查询,得到存放在多个表中的记录数据 ...
- mysql合并查询结果及为表和字段取别名
利用union关键字,可以给出多条select语句,并将它们的结果组合成单个的结果. 合并是,两个表对应的列数和数据类型必须相同. 各个select语句之间使用union或union all关键字分隔 ...
- MySQL给查询结果添加序号列的书写格式
一.给查询结果添加序号列的方法 1.方法一 set @counter=0; SELECT @counter:=@counter+1 as rank,t.s_score FROM score t 2.方 ...
- mysql 分组查询大于1_MySQL 一表分组查询max
一个很常见的较为复杂的查询,在同一张表里求某个分组下某个属性最高的前N位记录,主要有两种方法实现,这里详细说明一下. 假设一张表记录了员工,薪水和部门Id +----+-------+-------- ...
- 记Mysql同时查询更新同一张表的操作
直接查询修改同一张表会报错,这里换个思路,想办法变成是对两张表进行操作就能解决问题啦! UPDATE test SET IState=11 WHERE Id in (SELECT Id FROM (S ...
- mysql 查看某数据库中所有表的行数,information_schema.tables不准确。count(*)拼接准确。
mysql使用information_schema.tables统计表的行数,统计结果和count(*)的结果不一样. select table_name,table_rows from inform ...
- MySQL数据库与Oracle数据库中建表使用单引号和双引号的效果
一.Oracle数据库,使用单引号和双引号,以及不使用引号的区别 1.不使用引号,创建一个新表 -- 如果不使用引号,则表名和字段会自动转换成大写 create table Tatoo_Test(Na ...
- html之table删除和添加数据(获取行号和列号)
代码: <!DOCTYPE html> <html><head><meta charset="utf-8"><title> ...
- mysql 分页查询分析_mysql 大表分页查询测试分析优化
http://blog.csdn.net/xluren/article/details/32746183 http://www.cnblogs.com/kupig/archive/2011/10/19 ...
最新文章
- oracle 里 符号 || 表示什么意思??
- NASA宣布在火星上发现了3种有机分子
- 如何将记事本转换.php,记事本怎么变成表格?电脑便签如何将记事内容转化成Excel表格...
- 被迫学计算机,电脑强迫人学习
- Spark Relational Cache实现亚秒级响应的交互式分析
- 二层交换网络_网络中的第2层交换
- python做审计底稿视频_最新Python教学视频,每天自学俩小时,让你offer拿到手软...
- pycharm 常用设置
- 百度地图python_python百度地图API爬取街景
- 三 转码需求(智源GM813X多国语言OSD开发)
- 等价类划分法测试用例设计
- 如何创建VARCHART XGantt筛选器
- U盘插入苹果电脑后被分区,在Windows系统用不了怎么办。
- iMindMap中的虚线箭头如何进行使用
- 论文后面的参考文献格式应该如何写
- flex:1 代表了什么意思
- 攻防世界(练习小题)
- 031_组件 reRender控件和rendered控件的使用
- NX/UG二次开发-曲线-设置2D曲线最小曲率半径
- 9月编程排行榜新鲜出炉霸榜还得是它~
热门文章
- 智慧故事----每次进来看看都会有收获
- “软”苹果水逆的一周:杂志服务崩溃,新机型遭泄露,芯片首架离职
- 创业邦30岁以下青年企业家峰会暨颁奖典礼在京举行
- 调整Virtual Box硬盘大小
- SCCM 2012系列14 操作系统播发③
- vsftp tomcat jdk
- Codeforces Round #371 (Div. 2) C. Sonya and Queries 水题
- [JBoss] JNDI与JBossNS
- C++中include头文件使用与的区别
- PTA : 函数题 7-3 两个有序链表序列的交集 (20 分)