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

目录
  • mysql.help_topic
  • REPLACE
  • LENGHT
  • substring_index
  • 分析

有个群友问一个问题

这表的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拆分字符串查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL截取和拆分字符串函数用法示例

    本文实例讲述了MySQL截取和拆分字符串函数用法.分享给大家供大家参考,具体如下: 首先说截取字符串函数: SUBSTRING(commentid,9) 这个很简单,从第9个字符开始截取到最后.SUBSTRING的参数有三个,最后一个是截取的长度,默认是到结尾,负数是倒数第几位. 接着说拆分字符串函数: SUBSTRING_INDEX(commentid, '-', 1) 这个就稍稍复杂一些了,他的意思是以 - 进行拆分字符串,从第一个关键词开始取前面所有的字符串.如果上面的第三个参数修改为 -

  • MySQL 字符串拆分实例(无分隔符的字符串截取)

    无分隔符的字符串截取 题目要求 数据库中字段值: 实现效果:需要将一行数据变成多行 实现的sql SELECT LEFT(SUBSTRING('P1111',help_topic_id+1),1) AS num FROM mysql.help_topic WHERE help_topic_id < LENGTH('P1111'); 涉及的知识点 一.字符串截取:SUBSTRING(str,pos) 1.参数说明 参数名 解释 str 被截取的字符串 pos 从第几位开始截取,当 pos 为正数时

  • MySQL 字符串拆分操作(含分隔符的字符串截取)

    无分隔符的字符串截取 题目要求 数据库中字段值: 实现效果:需要将一行数据变成多行 实现的sql SELECT LEFT(SUBSTRING('P1111',help_topic_id+1),1) AS num FROM mysql.help_topic WHERE help_topic_id < LENGTH('P1111'); 涉及的知识点 一.字符串截取:SUBSTRING(str,pos) 1.参数说明 参数名 解释 str 需要拆分的字符串 delim 分隔符,通过某字符进行拆分 co

  • MySql字符串拆分实现split功能(字段分割转列)

    目录 需求描述 实现的sql 案例演示 字符串拆分: SUBSTRING_INDEX(str, delim, count) 替换函数:replace( str, from_str, to_str) 获取字符串长度:LENGTH( str ) 实现的原理解析 扩展:判断外部值是否在 num列值中 文章参考 需求描述 数据库中 num字段值为: 实现的效果:需要将一行数据变成多行 实现的sql SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,778

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

    目录 mysql.help_topic REPLACE LENGHT substring_index 分析 有个群友问一个问题 这表的ancestors列存放的是所有的祖先节点,以,分隔 例如我查询dept_id为103的所有祖先节点,现在我只有一个dept_id该怎么查 然后我去网上找到这样一个神奇的sql,改改表名就成了下面的这样 SELECT substring_index( substring_index( a.ancestors, ',', b.help_topic_id + 1 ),

  • MySQL查询字段实现字符串分割split功能的示例代码

    目录 问题背景 场景模拟 方法实现 SUBSTRING_INDEX LENGTH REPLACE SQL解析 问题背景 查询MySQL中用逗号分隔的字段[a,b,c]是否包含[a] 场景模拟 现有表[ec_logicplace],如下图所示: 要求判断数值[1]是否存在于表[ec_logicplace]中的[actual_place_id]中 方法实现 首先将[actual_place_id]字段用逗号拆分查询出来 通用模板为: SELECT SUBSTRING_INDEX( SUBSTRING

  • MyBatis XML方式的基本用法之多表查询功能的示例代码

    1. 多表查询 在之前,我们示例的2个查询都是单表查询,但实际的业务场景肯定是需要多表查询的,比如现在有个需求: 查询某个用户拥有的所有角色.这个需求要涉及到sys_user,sys_user_role,sys_role三张表,如何实现呢? 首先,在SysUserMapper接口中定义如下方法. /** * 根据用户id获取角色信息 * * @param userId * @return */ List<SysRole> selectRolesByUserId(Long userId); 然后

  • Python调用百度根据经纬度查询地址的示例代码

    如下所示: def locatebyLatLng(lat, lng, pois=0): ''' 根据经纬度查询地址 ''' items = {'location': str(lat) + ',' + str(lng), 'ak': '你自己申请的百度ak', 'output': 'json'} res = requests.get('http://api.map.baidu.com/geocoder/v2/', params=items) result = res.json() print(re

  • Python_查看sqlite3表结构,查询语句的示例代码

    如下所示: #!/usr/bin/env python3 # -*- coding: utf-8 -*- import sqlite3 conn = sqlite3.connect('test.db') # 创建一个Cursor: cursor = conn.cursor() # 查询记录: conn = sqlite3.connect('calendar.db') cursor = conn.cursor() # 执行查询语句: cursor.execute('select * from pe

  • MyBatis Plus 实现多表分页查询功能的示例代码

    在Mybatis Plus 中,虽然IService 接口帮我们定义了很多常用的方法,但这些都是 T 对象有用,如果涉及到 多表的查询,还是需要自定义Vo 对象和自己编写sql 语句,Mybatis Plus提供了一个Page 对象,查询是需要设置其中的 size 字段 和 current 字段的值 一.分页配置 可以直接使用selectPage这样的分页,但返回的数据确实是分页后的数据,但在控制台打印的SQL语句其实并没有真正的物理分页,而是通过缓存来获得全部数据中再进行的分页,这样对于大数据

  • Java 设置Excel条件格式示例代码(高亮条件值、应用单元格值/公式/数据条等类型)

    概述 在Excel中,应用条件格式功能可以在很大程度上改进表格的设计和可读性,用户可以指定单个或者多个单元格区域应用一种或者多种条件格式.本篇文章,将通过Java程序示例介绍条件格式的设置方法,设置条件格式时,因不同设置需要,本文分别从以下示例要点来介绍: 示例1: 1. 应用条件格式用于高亮重复.唯一数值 2. 应用条件格式用于高亮峰值(最高值.最低值) 3. 应用条件格式用于高亮低于或高于平均值的数值 示例2: 1. 应用单元格值类型的条件格式 2. 应用公式类型的条件格式 3. 应用数据条

  • LyScript实现指令查询功能的示例代码

    目录 搜索内存中的机器码 搜索内存反汇编代码 通过对LyScript自动化插件进行二次封装,实现从内存中读入目标进程解码后的机器码,并通过Python代码在这些机器码中寻找特定的十六进制字符数组,或直接检索是否存在连续的反汇编指令片段等功能. LyScript项目地址:https://github.com/lyshark/LyScript 搜索内存中的机器码 内存机器码需要配合LyScript32插件,从内存中寻找指令片段. from LyScript32 import MyDebug # 将可

  • MySQL开启Slow慢查询的方法示例

    前言 在mysql中slow query log是一个非常重要的功能,我们可以开启mysql的slow query log功能,这样就可以分析每条sql执行的状态与性能从而进行优化了. 本文就来给大家介绍了关于MySQL开启Slow慢查询的相关内容,下面话不多说,来一起看看详细的介绍吧 方法如下: 1:登录数据库查看是否已经开启了Slow慢查询: mysql> show variables like 'slow_query%'; 2:开启Mysql slow日志: 默认情况下slow_query

  • 利用JS如何计算字符串所占字节数示例代码

    前言 在工作中是不是经常会遇到字符串,但是要求控制字节数的需求?因为很多时候数据库中对字节数有控制,所以在前端过程中就需要判断一下,今天我们来分享一下. 本文主要给大家介绍了关于JS计算字符串所占字节数的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 示例代码 /** * 计算字符串所占的内存字节数,默认使用UTF-8的编码方式计算,也可制定为UTF-16 * UTF-8 是一种可变长度的 Unicode 编码格式,使用一至四个字节为每个字符编码 * * 000000

随机推荐