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锁机制
Apr 05 MySQL
详解MySQL事务的隔离级别与MVCC
Apr 22 MySQL
详解MySQL主从复制及读写分离
May 07 MySQL
Unity连接MySQL并读取表格数据的实现代码
Jun 20 MySQL
解决mysql的int型主键自增问题
Jul 15 MySQL
浅谈如何保证Mysql主从一致
Mar 13 MySQL
mysql使用instr达到in(字符串)的效果
Apr 03 MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 MySQL
mysql全面解析json/数组
Jul 07 MySQL
mysqldump进行数据备份详解
Jul 15 MySQL
关于MySQL中explain工具的使用
May 08 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
非洲第一个咖啡超凡杯大赛承办国—卢旺达的咖啡怎么样
2021/03/03 咖啡文化
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
jQuery Ajax 实例全解析
2011/04/20 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
jqGrid读取选择的多行的某个属性代码
2014/05/18 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
2015/09/06 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
微信小程序实现图片自适应(支持多图)
2017/01/25 Javascript
老生常谈ES6中的类
2017/07/31 Javascript
利用JQuery操作iframe父页面、子页面的元素和方法汇总
2017/09/10 jQuery
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
webpack打包html里面img后src为“[object Module]”问题
2019/12/22 Javascript
javascript代码实现简易计算器
2021/01/25 Javascript
详细探究Python中的字典容器
2015/04/14 Python
Python中functools模块的常用函数解析
2016/06/30 Python
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
Django框架多表查询实例分析
2018/07/04 Python
Python拼接字符串的7种方法总结
2018/11/01 Python
Python threading的使用方法解析
2019/08/28 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
2019/12/11 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
重写django的model下的objects模型管理器方式
2020/05/15 Python
详解Python 循环嵌套
2020/07/09 Python
python 制作简单的音乐播放器
2020/11/25 Python
python中二分查找法的实现方法
2020/12/06 Python
CSS3为背景图设置遮罩并解决遮罩样式继承问题
2020/06/22 HTML / CSS
Ray-Ban雷朋西班牙官网:全球领先的太阳眼镜品牌
2018/11/28 全球购物
abstract class和interface有什么区别
2013/08/04 面试题
服装设计行业个人的自我评价
2013/12/20 职场文书
计算机专业毕业生求职信分享
2013/12/24 职场文书
拉拉队口号
2014/06/16 职场文书
小学捐书活动总结
2014/07/05 职场文书
2015年质量月活动总结报告
2015/03/27 职场文书
python tkinter Entry控件的焦点移动操作
2021/05/22 Python