mysql拆分字符串作为查询条件的示例代码

 更新时间:2022年07月06日 08:25:01   作者:Jame!  
本文主要介绍了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.help_topic

这个是一个mysql自带的帮助解释注释表,查询结果如下

id从0开始,我这个版本最大id到584,版本不同应该id最大值也不一样,这个表的作用一会说

REPLACE

这个函数应该都知道吧,替换字符用的

LENGHT

获取字符串的长度

substring_index

查分字符串,三个参数,要拆分的字符串,根据拆分的字符,从第几个开始

如果最后的那个参数为正数则从左开始数,然后获取对应下标左边的所有字符

如果为负数,则从右边开始数,获取对应下标右边的所有字符串,这个就不演示了

分析

先来看第一段

( 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.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 Slow Log来解决MySQL CPU占用高的问题

    使用MySQL Slow Log来解决MySQL CPU占用高的问题

    在Linux VPS系统上有时候会发现MySQL占用CPU高,导致系统的负载比较高。这种情况很可能是某个SQL语句执行的时间太长导致的。优化一下这个SQL语句或者优化一下这个SQL引用的某个表的索引一般能解决问题
    2013-03-03
  • MySQ实现XA事务的具体使用

    MySQ实现XA事务的具体使用

    XA事务是一种分布式事务处理协议,本文主要介绍了MySQ实现XA事务的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • Mysql 5.7.18安装方法及启动MySQL服务的过程详解

    Mysql 5.7.18安装方法及启动MySQL服务的过程详解

    这篇文章主要介绍了Mysql 5.7.18安装方法及启动MySQL服务的过程,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-05-05
  • mysql innodb的监控(系统层,数据库层)

    mysql innodb的监控(系统层,数据库层)

    这篇文章主要介绍了mysql innodb的监控(系统层,数据库层)的相关资料,需要的朋友可以参考下
    2017-04-04
  • Windows实现通过cmd命令行启动mysql

    Windows实现通过cmd命令行启动mysql

    介绍了通过Windows命令行启动MySQL的详细步骤,包括普通启动和使用管理员权限的方法,以及如何登录和查询数据,主要步骤包括修改环境变量、使用net start命令、确保以管理员身份运行CMD,以及使用MySQL命令行工具进行数据库操作
    2024-10-10
  • MySQL和HBase的使用对比

    MySQL和HBase的使用对比

    MySQL和HBase是两种不同的数据库,MySQL是一个关系型数据库,支持事务,而HBase是一个NoSQL数据库,支持海量数据的读写,MySQL适用于OLTP业务,而HBase适用于OLAP业务
    2024-12-12
  • MySQL主从同步机制与同步延时问题追查过程

    MySQL主从同步机制与同步延时问题追查过程

    这篇文章主要给大家介绍了关于MySQL主从同步机制与同步延时问题追查的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • mysql如何修改表结构(alter table),多列/多字段

    mysql如何修改表结构(alter table),多列/多字段

    这篇文章主要介绍了mysql如何修改表结构(alter table),多列/多字段问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • MySQL触发器使用过程详解

    MySQL触发器使用过程详解

    触发器,就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段。本文将通过简单的实力介绍一下触发器的操作,需要的可以参考一下
    2023-03-03
  • SQL 聚合、分组和排序

    SQL 聚合、分组和排序

    这篇文章主要介绍了SQL 聚合、分组和排序,文章围绕SQL 聚合、分组、排序的相关资料展开具体内容,需要的朋友可以参考一下
    2021-11-11

最新评论