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 06 MySQL
MySql新手入门的基本操作汇总
May 13 MySQL
MySQL 隔离数据列和前缀索引的使用总结
May 14 MySQL
MySQL 常见存储引擎的优劣
Jun 02 MySQL
分析mysql中一条SQL查询语句是如何执行的
Jun 21 MySQL
浅析MySQL如何实现事务隔离
Jun 26 MySQL
MySQL系列之三 基础篇
Jul 02 MySQL
MySQL实例精讲单行函数以及字符数学日期流程控制
Oct 15 MySQL
mysql中整数数据类型tinyint详解
Dec 06 MySQL
MySql分区类型及创建分区的方法
Apr 13 MySQL
MySQL数据库实验之 触发器和存储过程
Jun 21 MySQL
了解MySQL查询语句执行过程(5大组件)
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
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
一步一步学习PHP(5) 类和对象
2010/02/16 PHP
PHP引用(&amp;)各种使用方法实例详解
2014/03/20 PHP
PHP解析目录路径的3个函数总结
2014/11/18 PHP
smarty模板引擎中变量及变量修饰器用法实例
2015/01/22 PHP
php使用类继承解决代码重复的问题
2015/02/11 PHP
php简单实现sql防注入的方法
2016/04/22 PHP
CL vs ForZe BO5 第四场 2.13
2021/03/10 DOTA
dwr spring的集成实现代码
2009/03/22 Javascript
jquery实现的一个导航滚动效果具体代码
2013/05/27 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
JS简单获取当前年月日星期的方法示例
2017/02/07 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
Bootstrap进度条实现代码解析
2017/03/07 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
微信小程序实现tab左右切换效果
2020/11/15 Javascript
Vuex的基本概念、项目搭建以及入坑点
2018/11/04 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
2019/12/09 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
[04:48]DOTA2上海特锦赛小组赛第三日 TOP10精彩集锦
2016/02/28 DOTA
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
利用python将pdf输出为txt的实例讲解
2018/04/23 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
2019/01/07 Python
python nohup 实现远程运行不宕机操作
2020/04/16 Python
Python接口测试结果集实现封装比较
2020/05/01 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
2021/02/03 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
2017/03/15 HTML / CSS
美国销售第一的智能手机和平板电脑保护壳:OtterBox
2017/12/21 全球购物
应用化学专业职业生涯规划书
2013/12/31 职场文书
财务总监管理职责范文
2014/03/09 职场文书
党旗在我心中演讲稿
2014/09/15 职场文书
学习保证书100字
2015/02/26 职场文书
MySQL创建管理KEY分区
2022/04/13 MySQL