mysql拆分字符串作为查询条件的示例代码


Posted in MySQL onJuly 07, 2022

有个群友问一个问题

mysql拆分字符串作为查询条件的示例代码

这表的ancestors列存放的是所有的祖先节点,以,分隔

例如我查询dept_id为103的所有祖先节点,现在我只有一个dept_id该怎么查

然后我去网上找到这样一个神奇的sql,改改表名就成了下面的这样

SELECT
		substring_index( substring_index( a.ancestors, ',', b.help_topic_id + 1 ), ',',- 1 ) AS shareholder 
	FROM
		sys_dept a
		JOIN mysql.help_topic b ON b.help_topic_id < ( length( a.ancestors ) - length( REPLACE ( a.ancestors, ',', '' ) ) + 1 ) 
	WHERE
	dept_id = 103

mysql拆分字符串作为查询条件的示例代码

嗯,没错结果出来了,然后我就很好奇,什么原理,一个个来看

mysql.help_topic

这个是一个mysql自带的帮助解释注释表,查询结果如下

mysql拆分字符串作为查询条件的示例代码

id从0开始,我这个版本最大id到584,版本不同应该id最大值也不一样,这个表的作用一会说

REPLACE

这个函数应该都知道吧,替换字符用的

mysql拆分字符串作为查询条件的示例代码

LENGHT

获取字符串的长度

mysql拆分字符串作为查询条件的示例代码

substring_index

查分字符串,三个参数,要拆分的字符串,根据拆分的字符,从第几个开始

如果最后的那个参数为正数则从左开始数,然后获取对应下标左边的所有字符

如果为负数,则从右边开始数,获取对应下标右边的所有字符串,这个就不演示了

mysql拆分字符串作为查询条件的示例代码

分析

mysql拆分字符串作为查询条件的示例代码

先来看第一段

( length( a.ancestors ) - length( REPLACE ( a.ancestors, ',', '' ) ) + 1 )

我们假设当前数据的ancestors值为 0,100,101 那么第一个length(a.ancestors)的值就是9 减去后面的一段

length( REPLACE ( a.ancestors, ',', '' ) ) 因为我们假设的值里面有两个 , 所以length为7 最后在加1 那么这段值为 3

和前面的 join on条件能查出的数据也就是mysql.help_topic这个表中所有id小于3的数据,也就是id为0,1,2的三条数据

那么现在先来看看这样查询的结果是啥

mysql拆分字符串作为查询条件的示例代码

那么我们假设现在是第一行,mysql.help_topic表中的help_topic_id为0

substring_index( substring_index( a.ancestors, ',', b.help_topic_id + 1 ), ',',- 1 )

最里面的substring_index 拆分后为0,因为没有能在拆分的了所以外面的substring_index返回的也是0

第二行help_topic_id为1的时候获取结果为0,100

然后执行外层的substring_index 根据,拆分,值为-1 所以从右边找一位,获取的值就是100

第三行结果为0,100,101,外层substring_index 执行后结果为101

....只能心中大喊牛逼

那么现在知道mysql.help_topic这个表的作用了吗?就是用来对拆分出的数据分行,专业点叫笛卡尔积 (真的不懂..)

这种方法也有缺点:就是拆出的行数不能大于mysql.help_topic这个表的数据条数

到此这篇关于mysql拆分字符串作为查询条件的示例代码的文章就介绍到这了,更多相关mysql拆分字符串查询内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
详解MySQL连接挂死的原因
May 18 MySQL
MySQL单表千万级数据处理的思路分享
Jun 05 MySQL
浅谈MySQL next-key lock 加锁范围
Jun 07 MySQL
通过shell脚本对mysql的增删改查及my.cnf的配置
Jul 07 MySQL
Mysql8.0递归查询的简单用法示例
Aug 04 MySQL
MySQL配置主从服务器(一主多从)
Aug 07 MySQL
浅谈MySQL表空间回收的正确姿势
Oct 05 MySQL
MySQL慢查询优化解决问题
Mar 17 MySQL
Mysql中的触发器定义及语法介绍
Jun 25 MySQL
mysql查看表结构的三种方法总结
Jul 07 MySQL
mysql函数之截取字符串的实现
Aug 14 MySQL
MySQL 原理优化之Group By的优化技巧
Aug 14 MySQL
mysql全面解析json/数组
Jul 07 #MySQL
Mysql表数据比较大情况下修改添加字段的方法实例
MySQL外键约束(Foreign Key)案例详解
Jun 28 #MySQL
MySQL主从切换的超详细步骤
Jun 28 #MySQL
浅谈MySql update会锁定哪些范围的数据
Jun 25 #MySQL
MySQL导致索引失效的几种情况
Jun 25 #MySQL
Mysql中的触发器定义及语法介绍
Jun 25 #MySQL
You might like
《雄兵连》系列首部大电影《烈阳天道》:可能是因为期望值太高了
2020/08/18 国漫
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
Zend Framework教程之Zend_Registry对象用法分析
2016/03/22 PHP
PHP远程连接oracle数据库操作实现方法图文详解
2019/04/11 PHP
js表格分页实现代码
2009/09/18 Javascript
JavaScript 学习笔记(七)字符串的连接
2009/12/31 Javascript
js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
2011/11/21 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
2012/05/23 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
cookie的复制与使用记住用户名实现代码
2013/11/04 Javascript
JS将表单导出成EXCEL的实例代码
2013/11/11 Javascript
可插入图片的TEXT文本框
2013/12/27 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
原生js实现class的添加和删除简单代码
2016/07/12 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
Element InfiniteScroll无限滚动的具体使用方法
2020/07/27 Javascript
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
Django model重写save方法及update踩坑详解
2020/07/27 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
资生堂美国官网:Shiseido美国
2016/09/02 全球购物
北京泡泡网网络有限公司.net面试题
2012/07/17 面试题
考试不及格检讨书
2014/01/09 职场文书
优秀志愿者事迹材料
2014/02/03 职场文书
工地安全质量标语
2014/06/07 职场文书
校运会新闻稿
2015/07/17 职场文书
2015年法律事务部工作总结
2015/07/27 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
2021/11/27 Vue.js
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers