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的MVCC多版本并发控制的实现
Apr 14 MySQL
MySQL 角色(role)功能介绍
Apr 24 MySQL
新手必备之MySQL msi版本下载安装图文详细教程
May 21 MySQL
Navicat for MySQL的使用教程详解
May 27 MySQL
mysql中int(3)和int(10)的数值范围是否相同
Oct 16 MySQL
记一次Mysql不走日期字段索引的原因小结
Oct 24 MySQL
MySQL数据库中varchar类型的数字比较大小的方法
Nov 17 MySQL
MySQL创建管理子分区
Apr 13 MySQL
深入理解MySQL中MVCC与BufferPool缓存机制
May 25 MySQL
MYSQL中文乱码问题的解决方案
Jun 14 MySQL
MySql按时,天,周,月进行数据统计
Aug 14 MySQL
MySql统计函数COUNT的具体使用详解
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
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
php实现快速对二维数组某一列进行组装的方法小结
2019/12/04 PHP
JavaScript prototype属性使用说明
2010/05/13 Javascript
js 函数的副作用分析
2011/08/23 Javascript
ie6下png图片背景不透明的解决办法使用js实现
2013/01/11 Javascript
jQuery中trigger()方法用法实例
2015/01/19 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
2015/03/13 Javascript
Bootstrap每天必学之响应式导航、轮播图
2016/04/25 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
原生Javascript和jQuery做轮播图简单例子
2016/10/11 Javascript
微信小程序 label 组件详解及简单实例
2017/01/10 Javascript
Javascript 链式作用域详细介绍
2017/02/23 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
vue父组件中获取子组件中的数据(实例讲解)
2017/09/27 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
Python中实现对list做减法操作介绍
2015/01/09 Python
Python随机数用法实例详解【基于random模块】
2017/04/18 Python
python中如何使用正则表达式的非贪婪模式示例
2017/10/09 Python
python 在屏幕上逐字显示一行字的实例
2018/12/24 Python
Python requests模块实例用法
2019/02/11 Python
对python多线程SSH登录并发脚本详解
2019/02/14 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
2020/08/07 Python
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
公司清洁工岗位职责
2013/12/14 职场文书
入职担保书怎么写
2014/05/12 职场文书
促销活动总结模板
2014/07/01 职场文书
目标责任书格式
2014/07/28 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
我们的节日春节活动方案
2014/08/22 职场文书
2015年党小组工作总结
2015/05/26 职场文书
爱国主义电影观后感
2015/06/18 职场文书
公司开业主持词
2015/07/02 职场文书