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对于模糊查询like的一些汇总
May 09 MySQL
解决mysql模糊查询索引失效问题的几种方法
Jun 18 MySQL
MySQL的安装与配置详细教程
Jun 26 MySQL
MySQL系列之四 SQL语法
Jul 02 MySQL
解决mysql的int型主键自增问题
Jul 15 MySQL
一次SQL如何查重及去重的实战记录
Mar 13 MySQL
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
Mar 22 MySQL
一文了解MYSQL三大范式和表约束
Apr 03 MySQL
Mysql调整优化之四种分区方式以及组合分区
Apr 13 MySQL
MySQL优化之慢日志查询
Jun 10 MySQL
MySQL 原理优化之Group By的优化技巧
Aug 14 MySQL
MySQL下载安装配置详细教程 附下载资源
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
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
PHP简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
PHP生成短网址的思路以及实现方法的详解
2019/03/25 PHP
Javascript 键盘事件的组合使用实现代码
2012/05/04 Javascript
JSONP 跨域共享信息
2012/08/16 Javascript
javascript 中__proto__和prototype详解
2014/11/25 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
2015/06/23 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
2016/06/30 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
2017/03/24 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
简单了解JavaScript作用域
2020/07/31 Javascript
浅析Python中的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
python和opencv实现抠图
2018/07/18 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
2018/10/11 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
python中报错&quot;json.decoder.JSONDecodeError: Expecting value:&quot;的解决
2019/04/29 Python
Python求两点之间的直线距离(2种实现方法)
2019/07/07 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
Python将字典转换为XML的方法
2020/08/01 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
使用CSS3编写灰阶滤镜来制作黑白照片效果的方法
2016/05/09 HTML / CSS
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
SQL Server面试题
2016/10/17 面试题
表彰大会策划方案
2014/05/13 职场文书
安全生产知识竞赛活动总结
2014/07/07 职场文书
网站文案策划岗位职责
2015/04/14 职场文书