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 InnoDB存储引擎的内存管理
Apr 08 MySQL
MySQL创建高性能索引的全步骤
May 02 MySQL
MySQL 自定义变量的概念及特点
May 13 MySQL
MySQL时间盲注的五种延时方法实现
May 18 MySQL
MySQL连接控制插件介绍
Sep 25 MySQL
面试中老生常谈的MySQL问答集锦夯实基础
Mar 13 MySQL
MySQL日期时间函数知识汇总
Mar 17 MySQL
MySQL如何快速创建800w条测试数据表
Mar 17 MySQL
Pycharm远程调试和MySQL数据库授权问题
Mar 18 MySQL
MySQL实现字段分割一行转多行的示例代码
Jul 07 MySQL
Mysql数据库group by原理详解
Jul 07 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
ADODB的数据库封包程序库
2006/12/31 PHP
php adodb分页实现代码
2009/03/19 PHP
Yii实现复选框批量操作实例代码
2017/03/15 PHP
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
Jquery获取和修改img的src值的方法
2014/02/17 Javascript
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
2015/09/06 Javascript
正则表达式优化JSON字符串的技巧
2015/12/24 Javascript
深入理解JavaScript中Ajax
2016/08/02 Javascript
JS+CSS3模拟溢出滚动效果
2016/08/12 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
2016/11/15 Javascript
基于JS实现bookstore静态页面的实例代码
2017/02/22 Javascript
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
微信小程序实现验证码获取倒计时效果
2018/02/08 Javascript
vue cli2.0单页面title修改方法
2018/06/07 Javascript
浅谈Vue数据响应思路之数组
2018/11/06 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
python实现图片变亮或者变暗的方法
2015/06/01 Python
Django使用Celery异步任务队列的使用
2018/03/13 Python
python使用Matplotlib画饼图
2018/09/25 Python
python实现定时压缩指定文件夹发送邮件
2020/12/22 Python
Django 1.10以上版本 url 配置注意事项详解
2019/08/05 Python
CSS3实现DIV圆角效果完整代码
2012/10/10 HTML / CSS
连锁经营管理专业大学生求职信
2013/10/30 职场文书
50岁生日感言
2014/01/23 职场文书
设计专业毕业生求职信
2014/06/25 职场文书
学校献爱心活动总结
2014/07/08 职场文书
2014年重阳节敬老活动方案
2014/09/16 职场文书
离婚协议书范文
2015/01/26 职场文书
广告业务员岗位职责
2015/02/13 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
车位出租协议书范本
2016/03/19 职场文书
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python
keepalived + nginx 实现高可用方案
2022/12/24 Servers