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令人咋舌的隐式转换
Apr 05 MySQL
MySQL infobright的安装步骤
Apr 07 MySQL
Mysql基础知识点汇总
May 26 MySQL
Mysql实现主从配置和多主多从配置
Jun 02 MySQL
MySQL连表查询分组去重的实现示例
Jul 01 MySQL
mysql连接查询中and与where的区别浅析
Jul 01 MySQL
MySQL系列之开篇 MySQL关系型数据库基础概念
Jul 02 MySQL
MySQL基础快速入门知识总结(附思维导图)
Sep 25 MySQL
mysql 联合索引生效的条件及索引失效的条件
Nov 20 MySQL
SQL注入篇学习之盲注/宽字节注入
Mar 03 MySQL
MySql分区类型及创建分区的方法
Apr 13 MySQL
MySQL事务的隔离级别详情
Jul 15 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
php strrpos()与strripos()函数
2013/08/31 PHP
JXTree对象,读取外部xml文件数据,生成树的函数
2007/04/02 Javascript
javascript 尚未实现错误解决办法
2008/11/27 Javascript
使用PHP+JQuery+Ajax分页的实现
2013/04/23 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
javascript实现控制的多级下拉菜单
2015/07/05 Javascript
JS实现鼠标滑过链接改变网页背景颜色的方法
2015/10/20 Javascript
基于JavaScript实现移除(删除)数组中指定元素
2016/01/04 Javascript
javascript html5 canvas实现可拖动省份的中国地图
2016/03/11 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
轮播的简单实现方法
2016/07/28 Javascript
JS数组返回去重后数据的方法解析
2017/01/03 Javascript
微信小程序 共用变量值的实现
2017/07/12 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
2017/12/08 Javascript
浅析Visual Studio Code断点调试Vue
2018/02/27 Javascript
JS获取指定月份的天数两种实现方法
2018/06/22 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&amp;平移轮播效果
2019/08/16 Javascript
js new Date()实例测试
2019/10/31 Javascript
JavaScript日期库date-fn.js使用方法解析
2020/09/09 Javascript
js定时器出现第一次延迟的原因及解决方法
2021/01/04 Javascript
Python中__init__.py文件的作用详解
2016/09/18 Python
python编写朴素贝叶斯用于文本分类
2017/12/21 Python
python实现决策树分类(2)
2018/08/30 Python
在Python中增加和插入元素的示例
2018/11/01 Python
Pycharm配置远程调试的方法步骤
2018/12/17 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
HTML5 manifest离线缓存的示例代码
2018/08/08 HTML / CSS
Java基础知识面试要点
2016/07/29 面试题
知识竞赛活动方案
2014/02/18 职场文书
土建专业毕业生自荐书
2014/07/04 职场文书
个人党性锻炼总结
2015/03/05 职场文书
简历中自我评价范文
2015/03/11 职场文书
详解Laravel框架的依赖注入功能
2021/05/27 PHP
SQL Server数据库查询出现阻塞之性能调优
2022/04/10 SQL Server