mysql拆分字符串做条件查询

mysql拆分字符串作为查询条件

有个群友问一个问题

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

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

如果最后一个参数为正,则从左侧开始计数,然后获取相应下标左侧的所有字符

[En]

If the last parameter is positive, count from the left, and then get all the characters to the left of the corresponding subscript

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

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的三条数据

现在让我们来看一下这个查询的结果。

[En]

So now let’s take a look at the result of this query.

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这个表的数据条数

Original: https://www.cnblogs.com/sunankang/p/16445918.html
Author: Jame!
Title: mysql拆分字符串做条件查询

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505256/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • java四种访问修饰符及各自的权限

    1.public,即共有的,是访问权限限制最宽的修饰符。被public修饰的类、属性、及方法不仅可以跨类访问,而且可以跨包访问。 2. protected,即保护访问权限,是介于p…

    数据库 2023年6月11日
    0131
  • jdbc分页

    一、最低级分页 resources下的db.properties db.driver=com.mysql.cj.jdbc.Driver db.url=jdbc:mysql://lo…

    数据库 2023年6月9日
    0158
  • InnoDB 中不同SQL语句设置的锁

    锁定读、UPDATE 或 DELETE 通常会给在SQL语句处理过程扫描到的每个索引记录上设置记录锁。语句中是否存在排除该行的WHERE条件并不重要。InnoDB不记得确切的WHE…

    数据库 2023年5月24日
    0133
  • PHP array_values()

    array_values array_values() 函数返回一个包含给定数组中所有键值的数组,但不保留键名。 示例: function arrayValues() { $dat…

    数据库 2023年6月14日
    0190
  • tomcat线程池

    tomcat线程池和普通的线程池设计上有所区别,下面主要来看看它是如何设计的 tomcat中线程池的创建 <span>org.apache.tomcat.util.ne…

    数据库 2023年6月16日
    0146
  • Redis集群(二)哨兵模式

    一、作用和架构 1. 作用 Redis Sentinel,即Redis哨兵,在Redis 2.8版本开始引入。哨兵的核心功能是 主节点的自动故障转移。下面是Redis官方文档对于哨…

    数据库 2023年6月11日
    0135
  • 8 int和Integer的区别

    数据类型 int是基本数据类型,Integer是int的包装类,属于引用类型 初始值 int的初始值为0,Integer的初始值为null 存储位置 int是直接存储在栈中的,In…

    数据库 2023年6月6日
    0148
  • 编译型语言和解释型语言

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月6日
    0191
  • Git

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月16日
    0130
  • 关于看源码的心得体会

    前段时间面试,经常遇到面试官在结束的时候问我看过什么开源源码?然后网上对于看源码这块的说法也有各种不同的意见,我进行了总结如下: 不看源码说法: 平常的工作需求、业务忙的一批,哪有…

    数据库 2023年6月6日
    0318
  • 【Java框架】– SpringBoot大文件RestTemplate下载解决方案

    近期基于项目上使用到的RestTemplate下载文件流,遇到1G以上的大文件,下载需要3-4分钟,因为调用API接口没有做分片与多线程, 文件流全部采用同步方式加载,性能很慢。最…

    数据库 2023年6月6日
    0164
  • 什么是真正的HTAP?(一)背景篇

    To digitally transform the business, AI must be real-time. For AI to be real-time, we need…

    数据库 2023年5月24日
    0152
  • podman基础用法

    podman的基础设置和使用 运行示例容器 列出正在运行的容器 检查正在运行的容器 测试httpd服务器 查看容器的日志 查看容器进程pid 对容器执行检查操作 还原容器 迁移容器…

    数据库 2023年6月14日
    0195
  • Redis 串行生成顺序编码

    场景:针对于分布式并发环境,易出现编码生成重复问题方案特点:串行操作可避免阻塞加锁,处理效率更高 具体解决方案 private final static String ENTERP…

    数据库 2023年6月6日
    0121
  • MySQL自带的四个系统数据库

    MySQL系统数据库mysql、information_schema、performance_schema、sys的结构和作用。 MySQL四个自带的数据库为mysql、infor…

    数据库 2023年6月11日
    0140
  • Linux 守护进程

    1. 守护进程是什么 2. 怎么用守护进程 2.1 有趣小例子 2.2 man daemon 3. 源码解析 3.1 GUN C daemon.c 3.2 daemon.c 解析 …

    数据库 2023年6月9日
    0119
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球