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三值逻辑与NULL
May 19 MySQL
.Net Core导入千万级数据至Mysql的步骤
May 24 MySQL
MySQL查看表和清空表的常用命令总结
May 26 MySQL
MySQL中使用or、in与union all在查询命令下的效率对比
May 26 MySQL
Unity连接MySQL并读取表格数据的实现代码
Jun 20 MySQL
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
Aug 02 MySQL
MySQL面试题讲解之如何设置Hash索引
Nov 01 MySQL
MySQL数据库索引的最左匹配原则
Nov 20 MySQL
一文搞清楚MySQL count(*)、count(1)、count(col)区别
Mar 03 MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 MySQL
一文解答什么是MySQL的回表
Aug 05 MySQL
MySQL索引失效十种场景与优化方案
May 08 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 单引号与双引号的区别
2009/11/24 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
php目录遍历函数opendir用法实例
2014/11/20 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
php给数组赋值的实例方法
2019/09/26 PHP
禁止js文件缓存的代码
2010/04/09 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
2013/08/05 Javascript
JavaScript判断undefined类型的正确方法
2015/06/30 Javascript
javascript创建对象、对象继承的实用方式详解
2016/03/08 Javascript
javascript中Date对象应用之简易日历实现
2016/07/12 Javascript
jQuery实现简单的网页换肤效果示例
2016/09/18 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
js 毫秒转天时分秒的实例
2017/11/17 Javascript
vue自定义一个v-model的实现代码
2018/06/21 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
vue element-ul实现展开和收起功能的实例代码
2020/11/25 Vue.js
微信小程序实现modal弹出框遮罩层组件(可带文本框)
2020/12/20 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
Python字符串处理实现单词反转
2017/06/14 Python
你真的了解Python的random模块吗?
2017/12/12 Python
django表单实现下拉框的示例讲解
2018/05/29 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
用Python实现最速下降法求极值的方法
2019/07/10 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
Python Dataframe常见索引方式详解
2020/05/27 Python
HTML5标签使用方法详解
2015/11/27 HTML / CSS
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
宿舍违规检讨书
2014/01/12 职场文书
2014年父亲节活动方案
2014/03/06 职场文书
2015年社区服务活动总结
2015/03/25 职场文书
海上钢琴师观后感
2015/06/03 职场文书
python lambda 表达式形式分析
2022/04/03 Python