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 相关文章推荐
jdbc使用PreparedStatement批量插入数据的方法
Apr 27 MySQL
解决MySQL存储时间出现不一致的问题
Apr 28 MySQL
MySQL sql_mode修改不生效的原因及解决
May 07 MySQL
Navicat for MySQL的使用教程详解
May 27 MySQL
Mysql文件存储图文详解
Jun 01 MySQL
MYSQL 无法识别中文的永久解决方法
Jun 03 MySQL
浅谈MySQL user权限表
Jun 18 MySQL
mysql5.7的安装及Navicate长久免费使用的实现过程
Nov 17 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
MySQL RC事务隔离的实现
Mar 31 MySQL
MySQL池化框架学习接池自定义
Jul 23 MySQL
MySQL中LAG()函数和LEAD()函数的使用
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中static静态变量的使用方法详解
2010/06/04 PHP
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
PHP基于Closure类创建匿名函数的方法详解
2017/08/17 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
jquery checkbox全选、取消全选实现代码
2010/03/05 Javascript
Extjs gridpanel 出现横向滚动条问题的解决方法
2011/07/04 Javascript
jQuery学习笔记之控制页面实现代码
2012/02/27 Javascript
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
jquery实现搜索框常见效果的方法
2015/01/22 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
javascript实现跨域的方法汇总
2015/06/25 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
jquery实现文字单行横移或翻转(上下、左右跳转)
2017/01/08 Javascript
layui 弹出层值回传解决方式
2019/11/14 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
原生js实现俄罗斯方块
2020/10/20 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
[03:01]2014DOTA2国际邀请赛 DC:我是核弹粉,为Burning和国土祝福
2014/07/13 DOTA
python检测远程服务器tcp端口的方法
2015/03/14 Python
Python爬虫实现全国失信被执行人名单查询功能示例
2018/05/03 Python
程序员写Python时的5个坏习惯,你有几条?
2018/11/26 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
2019/07/18 Python
简单了解python装饰器原理及使用方法
2019/12/18 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
python3 deque 双向队列创建与使用方法分析
2020/03/24 Python
HTML5中视频音频的使用详解
2017/07/07 HTML / CSS
canvas仿写贝塞尔曲线的示例代码
2017/12/29 HTML / CSS
Can a struct inherit from another class? (结构体能继承类吗)
2014/07/22 面试题
内部类的定义、种类以及优点
2013/10/16 面试题
物业经理求职自我评价
2013/09/22 职场文书
教研活动总结
2014/04/28 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
师德师风个人整改措施
2014/10/27 职场文书
幼儿园毕业致辞
2015/07/29 职场文书
nginx proxy_cache 缓存配置详解
2021/03/31 Servers