当前位置: 首页 > news >正文

mysql 视图 行号_MySQL踩坑记之视图添加行号

MySQL踩坑记之视图添加行号

问题背景

最近有一个需求, 需要给数据库中某系数据添加一个行号, 简单来说, 可以认为是按照某种规则进行排序后, 输出每一行的顺序. 这里本以为会进展的比较顺利(内心其实慌得一匹), 虽然作为一个老的Django用户, 我已经好久没有动过原生的SQL语句了, 努(绞尽)力(脑汁)回忆一把之前学过的数据库知识, 想到了这个应该是可以利用视图来实现的, 心想这里加一个行号不就OK了吗?

da1799466ea33db357040031ef355b9c.png

经过一顿冥(上)思(网)苦(搜)想(索), 发现这个对于Oracle来说, 是有自带的函数的, 可怜我用的MySQL, 又不能直接换成Oracle, 只能自己实现, 哎, 感觉自己头发少了好多, 我太难了, 在这里找解决方案的时候, 我遇到了不少的问题, 下面简单记录一下我解决问题的过程, 后面所有的表我都屏蔽了当时的业务, 按照最简化的原则处理.

初始表结构

在这里, 为了简化, 我们只用两个字段, name 和 score, 然后我们按照score的高低, 进行排序, 添加一列rank字段.

| name | score |

------------------

| Tom | 100 |

| Smith | 80 |

然后我们要创建的视图如下:

| name | score | rank |

--------------------------

| Tom | 100 | 1 |

| Smith | 80 | 2 |

解决历程

方案一: 查询添加中间变量

虽然作为一个很久不用原生SQL的人, 但是我还是依稀的记得上课中所提到的中间变量的方法的, 所以说最先想到的方案自然是添加查询中间变量了.

SELECT

@i := @i + 1 AS rank,

demo.name,

demo.score

FROM

demo,

( SELECT @i := 0 ) derivedTable

ORDER BY score DESC

这样查询出来, 结果是对的, 当时的心情, 可谓是一个开心.

0f2d355e4a3d0fcd4db65884f94c35b1.png

但是这种开心, 一会儿就被接下来的问题给我打断了, 也就是说, 这样查询是没毛病的, 但是吧, 如果你用视图, 会发现一个惊喜的错误.

CREATE

OR REPLACE VIEW vwx ( name, score, rank ) AS SELECT

demo.name,

demo.score,

@i := @i + 1 AS rank

FROM

demo,

( SELECT @i := 0 ) derivedTable

ORDER BY score DESC;

错误提示:

1351 - View's SELECT contains a variable or parameter, Time: 0.000000s

这句话的意思是, 您不能再视图中使用参数哦, 哎, 多么友好的提示, 在MySQL中, 数据库视图是不能够使用参数的, 之前学过的知识是还给老师了, 但是不影响, 实践是检验真理的唯一标准, 没成功, 哈哈, 就说明这样不行.

1f23f7d1572e303d885477e949f671b4.png

方案二: 自增函数

emmm, 如果不能用变量, 那我们只能换一种思路了, 我们能不能用函数呢? 写一个函数, 让每次返回的值都自动+1不就好了, 下面就是这个函数.

CREATE DEFINER=`root`@`localhost` FUNCTION `func_inc_var_session`(RESET BIT) RETURNS int(11)

NO SQL

BEGIN

IF RESET THEN

SET @var := 0;

ELSE

SET @var := IFNULL(@var,0) + 1;

END IF;

RETURN @var;

END

这个函数也是比较容易理解, 在这里就不多解释了, 实际上有两个功能置零和自增, 为什么要设置置零的操作呢? 在这里先卖一个关子, 后文再说, 然后我们接着再来利用这个函数来创建视图.

CREATE

OR REPLACE VIEW vwx ( name, score, rank ) AS SELECT

demo.name,

demo.score,

func_inc_var_session(0)

FROM

demo

ORDER BY NAME DESC;

我们来看一下效果

42328b241c77bba38f11c103fc987c78.png

这样看起来是不是很"完美"的实现蛤, 大家看到我给完美添加了引号, 也就说明这个写法是有缺陷的, 哎, 如果我们重新建立视图, 这个就会变成.

e601145d80549c51ec807c2c8299a9eb.png

是不是很惊喜, 这个值是全局变量, 是不会自己改成0的.

51af8fcd9b9161af19872b16980314de.png

方案三: 自增函数+每次重置

哎, 蓝瘦, 这样可不行啊, 这样虽然说是完成自增行号了, 但是吧是不符合我业务上的需求的, 因此, 我们要想办法, 怎么执行的时候给重置一下, 当然你也可以选择创建临时表, 这种操作对于我来说感觉太麻烦了, 为了视图, 我每次创建一张表, 这个开销也不小, 然后, 灵机一动, 有了最新的方案, 我们可以在每次执行的时候都来一个重置, 哈哈, 这里解释一下前文说为什么我要设置重置变量的功能, 到这里就用上了, 因为我已经写到这里了, 但是代码我又懒得改回去了, 加上这个参数多几行代码, 不太影响前文的思路, 因此, 我就没去掉.

OR REPLACE VIEW vwx ( NAME, score, rank ) AS SELECT

demo.name,

demo.score,

func_inc_var_session ( 0 )

FROM

demo

JOIN ( SELECT func_inc_var_session ( 1 ) ) derivedTable

ORDER BY score DESC;

这样就可以了, 每次刷新视图的时候序号都是固定的了, 哈哈, 这个问题我也想了好久, 最终解决了, 感觉我对于SQL的使用还是太生疏了, 不过感觉Oracle是真的好, 自带这个函数, 不过毕竟人家是收费的, 咱用着免费的, 也不能奢求太多, 哈哈, 到这里问题就解决完成了, 可能对于大佬们来说, 这个并不难, 如果大家有更好的写法, 也欢迎告诉我.

相关文章:

  • dos 前一个命令_非常实用的几个DOS命令,轻松解决电脑问题
  • shell mysql命令的参数_Linux/Unix shell 参数传递到SQL脚本
  • shell 循环 mysql_shell脚本备份mysql数据库(for循环)
  • swift 路由管理_京东商城订单模块Swift探索
  • 修改图片创建时间_Linux如何查看文件的创建、修改时间?
  • mysql 范式化_Mysql范式与反范式
  • jsp ssh mysql是什么_JSP+SSH+Mysql实现的学生管理系统
  • MySQL备机比主机binlog大_关于PostgreSQL流复制的延迟
  • python tempfile模块用不了_Python tempfile模块和线程表现不佳;我做错了什么?
  • python怎么发图文_python3开发微信企业号发送图文方法
  • java zip文件夹_【转】Java实现将文件或者文件夹压缩成zip
  • java线程接口_Java多线程相关的常用接口
  • java 字符串 宽度,用Java计算字符串的显示宽度
  • java string转gbk_Java String UTF-8 和 GBK 互换
  • java获取jsp session_前台jsp页面获取session对象
  • [case10]使用RSQL实现端到端的动态查询
  • 08.Android之View事件问题
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • fetch 从初识到应用
  • Go 语言编译器的 //go: 详解
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Java-详解HashMap
  • MySQL QA
  • React-flux杂记
  • SpringBoot几种定时任务的实现方式
  • Vim 折腾记
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 编写高质量JavaScript代码之并发
  • 记一次和乔布斯合作最难忘的经历
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 我的业余项目总结
  • 我看到的前端
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 阿里云重庆大学大数据训练营落地分享
  • 数据可视化之下发图实践
  • #数学建模# 线性规划问题的Matlab求解
  • (补)B+树一些思想
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (译)2019年前端性能优化清单 — 下篇
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)visual stdio 书签功能介绍
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET 中的轻量级线程安全
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .Net7 环境安装配置
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • /3GB和/USERVA开关
  • @Async注解的坑,小心
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解