mysql拆分字符串作為查詢條件的示例代碼
有個(gè)群友問(wèn)一個(gè)問(wèn)題

這表的ancestors列存放的是所有的祖先節(jié)點(diǎn),以,分隔
例如我查詢dept_id為103的所有祖先節(jié)點(diǎn),現(xiàn)在我只有一個(gè)dept_id該怎么查
然后我去網(wǎng)上找到這樣一個(gè)神奇的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

嗯,沒錯(cuò)結(jié)果出來(lái)了,然后我就很好奇,什么原理,一個(gè)個(gè)來(lái)看
mysql.help_topic
這個(gè)是一個(gè)mysql自帶的幫助解釋注釋表,查詢結(jié)果如下

id從0開始,我這個(gè)版本最大id到584,版本不同應(yīng)該id最大值也不一樣,這個(gè)表的作用一會(huì)說(shuō)
REPLACE
這個(gè)函數(shù)應(yīng)該都知道吧,替換字符用的

LENGHT
獲取字符串的長(zhǎng)度

substring_index
查分字符串,三個(gè)參數(shù),要拆分的字符串,根據(jù)拆分的字符,從第幾個(gè)開始
如果最后的那個(gè)參數(shù)為正數(shù)則從左開始數(shù),然后獲取對(duì)應(yīng)下標(biāo)左邊的所有字符
如果為負(fù)數(shù),則從右邊開始數(shù),獲取對(duì)應(yīng)下標(biāo)右邊的所有字符串,這個(gè)就不演示了

分析

先來(lái)看第一段
( length( a.ancestors ) - length( REPLACE ( a.ancestors, ',', '' ) ) + 1 )
我們假設(shè)當(dāng)前數(shù)據(jù)的ancestors值為 0,100,101 那么第一個(gè)length(a.ancestors)的值就是9 減去后面的一段
length( REPLACE ( a.ancestors, ',', '' ) ) 因?yàn)槲覀兗僭O(shè)的值里面有兩個(gè) , 所以length為7 最后在加1 那么這段值為 3
和前面的 join on條件能查出的數(shù)據(jù)也就是mysql.help_topic這個(gè)表中所有id小于3的數(shù)據(jù),也就是id為0,1,2的三條數(shù)據(jù)
那么現(xiàn)在先來(lái)看看這樣查詢的結(jié)果是啥

那么我們假設(shè)現(xiàn)在是第一行,mysql.help_topic表中的help_topic_id為0
substring_index( substring_index( a.ancestors, ',', b.help_topic_id + 1 ), ',',- 1 )
最里面的substring_index 拆分后為0,因?yàn)闆]有能在拆分的了所以外面的substring_index返回的也是0
第二行help_topic_id為1的時(shí)候獲取結(jié)果為0,100
然后執(zhí)行外層的substring_index 根據(jù),拆分,值為-1 所以從右邊找一位,獲取的值就是100
第三行結(jié)果為0,100,101,外層substring_index 執(zhí)行后結(jié)果為101
....只能心中大喊牛逼
那么現(xiàn)在知道mysql.help_topic這個(gè)表的作用了嗎?就是用來(lái)對(duì)拆分出的數(shù)據(jù)分行,專業(yè)點(diǎn)叫笛卡爾積 (真的不懂..)
這種方法也有缺點(diǎn):就是拆出的行數(shù)不能大于mysql.help_topic這個(gè)表的數(shù)據(jù)條數(shù)
到此這篇關(guān)于mysql拆分字符串作為查詢條件的示例代碼的文章就介紹到這了,更多相關(guān)mysql拆分字符串查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- PostgreSQL拆分字符串的三種方式
- mysql中字符串截取與拆分的實(shí)現(xiàn)示例
- SQL?將一列拆分成多列的實(shí)現(xiàn)示例
- MySQL按時(shí)間拆分千萬(wàn)級(jí)大表的實(shí)現(xiàn)代碼
- SQL案例學(xué)習(xí)之字符串的合并與拆分方法總結(jié)
- MySql字符串拆分實(shí)現(xiàn)split功能(字段分割轉(zhuǎn)列)
- MySQL 字符串拆分實(shí)例(無(wú)分隔符的字符串截取)
- MySQL 字符串拆分操作(含分隔符的字符串截取)
- MySQL 表的垂直拆分和水平拆分
- SQL 將一列拆分成多列的三種方法
- SQLserver 表拆分的使用示例
相關(guān)文章
使用MySQL Slow Log來(lái)解決MySQL CPU占用高的問(wèn)題
在Linux VPS系統(tǒng)上有時(shí)候會(huì)發(fā)現(xiàn)MySQL占用CPU高,導(dǎo)致系統(tǒng)的負(fù)載比較高。這種情況很可能是某個(gè)SQL語(yǔ)句執(zhí)行的時(shí)間太長(zhǎng)導(dǎo)致的。優(yōu)化一下這個(gè)SQL語(yǔ)句或者優(yōu)化一下這個(gè)SQL引用的某個(gè)表的索引一般能解決問(wèn)題2013-03-03
MySQ實(shí)現(xiàn)XA事務(wù)的具體使用
XA事務(wù)是一種分布式事務(wù)處理協(xié)議,本文主要介紹了MySQ實(shí)現(xiàn)XA事務(wù)的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
Mysql 5.7.18安裝方法及啟動(dòng)MySQL服務(wù)的過(guò)程詳解
這篇文章主要介紹了Mysql 5.7.18安裝方法及啟動(dòng)MySQL服務(wù)的過(guò)程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05
mysql innodb的監(jiān)控(系統(tǒng)層,數(shù)據(jù)庫(kù)層)
這篇文章主要介紹了mysql innodb的監(jiān)控(系統(tǒng)層,數(shù)據(jù)庫(kù)層)的相關(guān)資料,需要的朋友可以參考下2017-04-04
Windows實(shí)現(xiàn)通過(guò)cmd命令行啟動(dòng)mysql
介紹了通過(guò)Windows命令行啟動(dòng)MySQL的詳細(xì)步驟,包括普通啟動(dòng)和使用管理員權(quán)限的方法,以及如何登錄和查詢數(shù)據(jù),主要步驟包括修改環(huán)境變量、使用net start命令、確保以管理員身份運(yùn)行CMD,以及使用MySQL命令行工具進(jìn)行數(shù)據(jù)庫(kù)操作2024-10-10
MySQL主從同步機(jī)制與同步延時(shí)問(wèn)題追查過(guò)程
這篇文章主要給大家介紹了關(guān)于MySQL主從同步機(jī)制與同步延時(shí)問(wèn)題追查的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
mysql如何修改表結(jié)構(gòu)(alter table),多列/多字段
這篇文章主要介紹了mysql如何修改表結(jié)構(gòu)(alter table),多列/多字段問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12

