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 相关文章推荐
.Net Core导入千万级数据至Mysql的步骤
May 24 MySQL
Mysql数据库索引面试题(程序员基础技能)
May 31 MySQL
详细谈谈MYSQL中的COLLATE是什么
Jun 11 MySQL
MySQL GRANT用户授权的实现
Jun 18 MySQL
MySQL中连接查询和子查询的问题
Sep 04 MySQL
SQL优化老出错,那是你没弄明白MySQL解释计划用法
Nov 27 MySQL
分享几个简单MySQL优化小妙招
Mar 31 MySQL
CentOS MySql8 远程连接实战
Apr 19 MySQL
Mysql 文件配置解析介绍
May 06 MySQL
mysql 体系结构和存储引擎介绍
May 06 MySQL
MySQL的意向共享锁、意向排它锁和死锁
Jul 15 MySQL
MySQL count(*)统计总数问题汇总
Sep 23 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
mysql 搜索之简单应用
2007/04/27 PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
2014/06/13 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
2017/02/17 PHP
纯js实现的论坛常用的运行代码的效果
2008/07/15 Javascript
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
2010/06/10 Javascript
JavaScript OOP面向对象介绍
2010/12/02 Javascript
疯狂Jquery第一天(Jquery学习笔记)
2012/05/11 Javascript
探讨JavaScript中声明全局变量三种方式的异同
2013/12/03 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2014/09/04 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
2016/11/16 Javascript
H5基于iScroll实现下拉刷新和上拉加载更多
2017/07/18 Javascript
js实现鼠标跟随运动效果
2020/08/02 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
Iview Table组件中各种组件扩展的使用
2018/10/20 Javascript
NodeJS读取分析Nginx错误日志的方法
2019/05/14 NodeJs
js闭包和垃圾回收机制示例详解
2021/03/01 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
在python中,使用scatter绘制散点图的实例
2019/07/03 Python
python cumsum函数的具体使用
2019/07/29 Python
Python加密模块的hashlib,hmac模块使用解析
2020/01/02 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
Django修改app名称和数据表迁移方案实现
2020/09/17 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
css3如何绘制一个圆圆的loading转圈动画
2018/01/09 HTML / CSS
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
车间工艺员岗位职责
2013/12/09 职场文书
“四风”问题整改措施和努力方向
2014/09/20 职场文书
购房协议书范本
2014/10/02 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
WebWorker 封装 JavaScript 沙箱详情
2021/11/02 Javascript
方法汇总:Python 安装第三方库常用
2022/04/26 Python