mysql實現(xiàn)connect by start with方式
前言
1、mysql沒有層級查詢方法 而 oracle通過connect by start with語法可以實現(xiàn)層級查詢
2、mysql實現(xiàn)層級查詢的方式很多,有使用存儲過程函數(shù)嵌套調用亦有使用臨時表進行層級查詢
3、本文使用一種變量循環(huán)賦值方式進行,可以套用模版
實驗
-- 創(chuàng)建測試表 -- DROP TABLE IF EXISTS `test_tree`; CREATE TABLE `test_tree` ( `id` varchar(10) DEFAULT NULL, `name` varchar(10) DEFAULT NULL, `pId` varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 創(chuàng)建測試數(shù)據(根節(jié)點默認-1) INSERT INTO `test_tree` VALUES ('1', '中國', '-1'); INSERT INTO `test_tree` VALUES ('2', '福建省', '1'); INSERT INTO `test_tree` VALUES ('3', '海南省', '1'); INSERT INTO `test_tree` VALUES ('4', '泉州市', '2'); INSERT INTO `test_tree` VALUES ('5', '福州市', '2'); INSERT INTO `test_tree` VALUES ('6', '泉港區(qū)', '4'); INSERT INTO `test_tree` VALUES ('7', '惠安縣', '4');
-- 模版 表名代替test_tree 用id替換以下id 用pid替換以下 用其他從屬字段替換name SELECT name, id, pid, @le:= IF (pid = -1 ,0,IF( LOCATE( CONCAT('|',pid,':'),@pathlevel) > 0,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',pid,':'),-1),'|',1) +1,@le+1) ) levels, @pathlevel:= CONCAT(@pathlevel,'|',id,':', @le ,'|') pathlevel, @pathnodes:= IF( pid =-1,',root', CONCAT_WS(',',IF( LOCATE( CONCAT('|',pid,':'),@pathall) > 0 ,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,CONCAT('|',pid,':'),-1),'|',1),@pathnodes ) ,pid ) )paths, @pathall:=CONCAT(@pathall,'|',id,':', @pathnodes ,'|') pathall FROM test_tree, ( SELECT @le:=0, @pathlevel:='', @pathall:='', @pathnodes:='' ) vv ORDER BY pid,id -- 結合instr(paths,'想要查所有子集的父級id')>0 驗證 SELECT name, id, pid, levels, paths FROM ( SELECT name, id, pid, @le:= IF (pid = -1 ,0,IF( LOCATE( CONCAT('|',pid,':'),@pathlevel) > 0,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',pid,':'),-1),'|',1) +1,@le+1) ) levels, @pathlevel:= CONCAT(@pathlevel,'|',id,':', @le ,'|') pathlevel, @pathnodes:= IF( pid =-1,',root', CONCAT_WS(',',IF( LOCATE( CONCAT('|',pid,':'),@pathall) > 0 ,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,CONCAT('|',pid,':'),-1),'|',1),@pathnodes ) ,pid ) )paths, @pathall:=CONCAT(@pathall,'|',id,':', @pathnodes ,'|') pathall FROM test_tree, ( SELECT @le:=0, @pathlevel:='', @pathall:='', @pathnodes:='' ) vv ORDER BY pid,id ) src WHERE instr(paths,'-1')>0 ORDER BY pid
驗證結果
1、數(shù)據
2 查詢中國
SELECT name, id, pid, levels, paths FROM ( SELECT name, id, pid, @le:= IF (pid = -1 ,0,IF( LOCATE( CONCAT('|',pid,':'),@pathlevel) > 0,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',pid,':'),-1),'|',1) +1,@le+1) ) levels, @pathlevel:= CONCAT(@pathlevel,'|',id,':', @le ,'|') pathlevel, @pathnodes:= IF( pid =-1,',root', CONCAT_WS(',',IF( LOCATE( CONCAT('|',pid,':'),@pathall) > 0 ,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,CONCAT('|',pid,':'),-1),'|',1),@pathnodes ) ,pid ) )paths, @pathall:=CONCAT(@pathall,'|',id,':', @pathnodes ,'|') pathall FROM test_tree, ( SELECT @le:=0, @pathlevel:='', @pathall:='', @pathnodes:='' ) vv ORDER BY pid,id ) src WHERE instr(paths,'1')>0 ORDER BY pid
3 查詢福建省
SELECT name, id, pid, levels, paths FROM ( SELECT name, id, pid, @le:= IF (pid = -1 ,0,IF( LOCATE( CONCAT('|',pid,':'),@pathlevel) > 0,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',pid,':'),-1),'|',1) +1,@le+1) ) levels, @pathlevel:= CONCAT(@pathlevel,'|',id,':', @le ,'|') pathlevel, @pathnodes:= IF( pid =-1,',root', CONCAT_WS(',',IF( LOCATE( CONCAT('|',pid,':'),@pathall) > 0 ,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,CONCAT('|',pid,':'),-1),'|',1),@pathnodes ) ,pid ) )paths, @pathall:=CONCAT(@pathall,'|',id,':', @pathnodes ,'|') pathall FROM test_tree, ( SELECT @le:=0, @pathlevel:='', @pathall:='', @pathnodes:='' ) vv ORDER BY pid,id ) src WHERE instr(paths,'2')>0 ORDER BY pid
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
一文搞清楚MySQL count(*)、count(1)、count(col)區(qū)別
本文主要介紹了MySQL count(*)、count(1)、count(col)區(qū)別,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03MySQL設置global變量和session變量的兩種方法詳解
這篇文章主要介紹了MySQL設置global變量和session變量的兩種方法,每種方法給大家介紹的非常詳細 ,需要的朋友可以參考下2018-10-10詳解MySQL數(shù)據庫insert和update語句
用于操作數(shù)據庫的SQL一般分為兩種,一種是查詢語句,也就是我們所說的SELECT語句,另外一種就是更新語句,也叫做數(shù)據操作語句。接下來通過本文給大家介紹MySQL數(shù)據庫insert和update語句,需要的朋友一起學習吧2016-04-04mysql數(shù)據庫超過最大連接數(shù)的解決方法
當mysql超過最大連接數(shù)時,會報錯”Too many connections”,本文主要介紹了mysql數(shù)據庫超過最大連接數(shù)的解決方法,具有一定的參考價值,感興趣的可以了解一下2023-12-12MySQL從命令行導入SQL腳本時出現(xiàn)中文亂碼的解決方法
這篇文章主要介紹了MySQL從命令行導入SQL腳本時出現(xiàn)中文亂碼的解決方法,分析了中文亂碼出現(xiàn)的原因并給出了兩種解決方法供大家參考,需要的朋友可以參考下2016-09-09mysql使用GROUP BY分組實現(xiàn)取前N條記錄的方法
這篇文章主要介紹了mysql使用GROUP BY分組實現(xiàn)取前N條記錄的方法,結合實例形式較為詳細的分析了mysql中GROUP BY分組的相關使用技巧,需要的朋友可以參考下2016-06-06基于MySQL數(shù)據庫復制Master-Slave架構的分析
本篇文章是對MySQL數(shù)據庫復制Master-Slave架構進行了詳細的分析介紹,需要的朋友參考下2013-06-06