当前位置:网站首页> mysql拆分字符串作为查询条件的示例代码
mysql拆分字符串作为查询条件的示例代码
2022-07-06 15:36:00 【1024问】
mysql.help_topic
REPLACE
LENGHT
substring_index
分析
有个群友问一个问题
这表的ancestors列存放的是所有的祖先节点,以,
分隔
例如我查询dept_id为103的所有祖先节点,现在我只有一个dept_id该怎么查
然后我去网上找到这样一个神奇的sql,改改表名就成了下面的这样
SELECTsubstring_index( substring_index( a.ancestors, ',', b.help_topic_id + 1 ), ',',- 1 ) AS shareholder FROMsys_dept aJOIN mysql.help_topic b ON b.help_topic_id < ( length( a.ancestors ) - length( REPLACE ( a.ancestors, ',', '' ) ) + 1 ) WHEREdept_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拆分字符串查询内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网!
边栏推荐
- Config:invalid signature solution and troubleshooting details
- Windows auzre background operation interface of Microsoft's cloud computing products
- Inno setup packaging and signing Guide
- C# 三种方式实现Socket数据接收
- HDU 5077 NAND (violent tabulation)
- Cloud native technology container knowledge points
- OpenNMS分离数据库
- config:invalid signature 解决办法和问题排查详解
- Is "applet container technology" a gimmick or a new outlet?
- European Bioinformatics Institute 2021 highlights report released: nearly 1million proteins have been predicted by alphafold
猜你喜欢
专为决策树打造,新加坡国立大学&清华大学联合提出快速安全的联邦学习新系统
On file uploading of network security
Aardio - integrate variable values into a string of text through variable names
CSDN 上传图片取消自动加水印的方法
云原生技术--- 容器知识点
Unified Focal loss: Generalising Dice and cross entropy-based losses to handle class imbalanced medi
金融人士必读书籍系列之六:权益投资(基于cfa考试内容大纲和框架)
#DAYU200体验官# 首页aito视频&Canvas绘制仪表盘(ets)
室内LED显示屏应该怎么选择?这5点注意事项必须考虑在内
Financial professionals must read book series 6: equity investment (based on the outline and framework of the CFA exam)
随机推荐
[leetcode] 19. Delete the penultimate node of the linked list
Pit encountered by handwritten ABA
What are the specific steps and schedule of IELTS speaking?
Dayu200 experience officer runs the intelligent drying system page based on arkui ETS on dayu200
On file uploading of network security
OpenSSL:适用TLS与SSL协议的全功能工具包,通用加密库
Self made j-flash burning tool -- QT calls jlinkarm DLL mode
Les entreprises ne veulent pas remplacer un système vieux de dix ans
[untitled]
Dealing with the crash of QT quick project in offscreen mode
让我们,从头到尾,通透网络I/O模型
案例推荐丨安擎携手伙伴,保障“智慧法院”更加高效
专为决策树打造,新加坡国立大学&清华大学联合提出快速安全的联邦学习新系统
Interview question: AOF rewriting mechanism, redis interview must ask!!!
机试刷题1
Typescript get function parameter type
Return keyword
AdaViT——自适应选择计算结构的动态网络
【LeetCode】19、 删除链表的倒数第 N 个结点
HDU 5077 NAND (violent tabulation)