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 update set 和 and的区别
May 08 MySQL
浅谈mysql执行过程以及顺序
May 12 MySQL
Mysql效率优化定位较低sql的两种方式
May 26 MySQL
探究Mysql模糊查询是否区分大小写
Jun 11 MySQL
MySQL 四种连接和多表查询详解
Jul 16 MySQL
MySQL千万级数据表的优化实战记录
Aug 04 MySQL
MySQL中连接查询和子查询的问题
Sep 04 MySQL
MySQL优化常用的19种有效方法(推荐!)
Mar 17 MySQL
WINDOWS下安装mysql 8.x 的方法图文教程
Apr 19 MySQL
MySQL自定义函数及触发器
Aug 05 MySQL
MySQL存储过程及语法详解
Aug 05 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
php5数字型字符串加解密代码
2008/04/24 PHP
PHP CURL模拟GET及POST函数代码
2010/04/25 PHP
PHP和MYSQL实现分页导航思路详解
2017/04/11 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
2018/06/11 PHP
json 定义
2008/06/10 Javascript
javascript new 需不需要继续使用
2009/07/02 Javascript
Javascript 类与静态类的实现(续)
2010/04/02 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
jquery实现广告上下滚动效果
2021/03/04 jQuery
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
[50:34]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python字符转换
2008/09/06 Python
利用Django框架中select_related和prefetch_related函数对数据库查询优化
2015/04/01 Python
python中requests模块的使用方法
2015/04/08 Python
对pandas的算术运算和数据对齐实例详解
2018/12/22 Python
python图像处理入门(一)
2019/04/04 Python
python 利用turtle库绘制笑脸和哭脸的例子
2019/11/23 Python
基于python实现图片转字符画代码实例
2020/09/04 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
sklearn中的交叉验证的实现(Cross-Validation)
2021/02/22 Python
浅谈基于HTML5的在线视频播放方案
2016/02/18 HTML / CSS
HTML5 canvas基本绘图之图形组合
2016/06/27 HTML / CSS
美津浓巴西官方网站:Mizuno巴西
2019/07/24 全球购物
Yahoo-PHP面试题2
2014/12/06 面试题
职工运动会邀请函
2014/01/19 职场文书
应届硕士毕业生自荐信
2014/05/26 职场文书
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
2014年建筑工作总结
2014/11/26 职场文书
关于感谢信的范文
2015/01/23 职场文书
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python
python中24小时制转换为12小时制的方法
2021/06/18 Python