mysql 遞歸查找菜單節(jié)點(diǎn)的所有子節(jié)點(diǎn)的方法
背景
項(xiàng)目中遇到一個(gè)需求,要求查處菜單節(jié)點(diǎn)的所有節(jié)點(diǎn),在網(wǎng)上查了一下,大多數(shù)的方法用到了存儲過程,由于線上環(huán)境不能隨便添加存儲過程,
因此在這里采用類似遞歸的方法對菜單的所有子節(jié)點(diǎn)進(jìn)行查詢。
準(zhǔn)備
創(chuàng)建menu表:
CREATE TABLE `menu` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜單id', `parent_id` int(11) DEFAULT NULL COMMENT '父節(jié)點(diǎn)id', `menu_name` varchar(128) DEFAULT NULL COMMENT '菜單名稱', `menu_url` varchar(128) DEFAULT '' COMMENT '菜單路徑', `status` tinyint(3) DEFAULT '1' COMMENT '菜單狀態(tài) 1-有效;0-無效', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=12212 DEFAULT CHARSET=utf8;
插入數(shù)據(jù):
INSERT INTO `menu` VALUES ('0', null, '菜單0', ' ', '1');
INSERT INTO `menu` VALUES ('1', '0', '菜單1', '', '1');
INSERT INTO `menu` VALUES ('11', '1', '菜單11', '', '1');
INSERT INTO `menu` VALUES ('12', '1', '菜單12', '', '1');
INSERT INTO `menu` VALUES ('13', '1', '菜單13', '', '1');
INSERT INTO `menu` VALUES ('111', '11', '菜單111', '', '1');
INSERT INTO `menu` VALUES ('121', '12', '菜單121', '', '1');
INSERT INTO `menu` VALUES ('122', '12', '菜單122', '', '1');
INSERT INTO `menu` VALUES ('1221', '122', '菜單1221', '', '1');
INSERT INTO `menu` VALUES ('1222', '122', '菜單1222', '', '1');
INSERT INTO `menu` VALUES ('12211', '1222', '菜單12211', '', '1');
得到的目錄結(jié)構(gòu)如下圖所示:

查詢
先貼出sql語句:
比如,要查詢菜單節(jié)點(diǎn)12的所有子節(jié)點(diǎn),則查處的結(jié)果為:

分析
首先分析from后面的語句,根據(jù)parent_id和id 排序,并將要查詢的菜單節(jié)點(diǎn)當(dāng)做變量,from后面的結(jié)果為

接下來看if(express1,express2,express3)條件語句,if語句類似三目運(yùn)算符,當(dāng)exprss1成立時(shí),執(zhí)行express2,否則執(zhí)行express3;
FIND_IN_SET(str,strlist),str 要查詢的字符串,strlist 字段名 參數(shù)以”,”分隔 如 (1,2,6,8),查詢字段(strlist)中包含(str)的結(jié)果,返回結(jié)果為null或記錄
如果parent_id 在@pid中,則將@pid 里面再加上parent_id,按行依次執(zhí)行,執(zhí)行過程如下表所示:

這時(shí),顯示的id就是菜單id為12的所有子節(jié)點(diǎn)id
到此這篇關(guān)于mysql 遞歸查找菜單節(jié)點(diǎn)的所有子節(jié)點(diǎn)的文章就介紹到這了,更多相關(guān)mysql 遞歸查找菜單節(jié)點(diǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
win10 安裝mysql 8.0.18-winx64的步驟詳解
這篇文章主要介紹了win10 安裝mysql 8.0.18-winx64的步驟,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
MySQL數(shù)據(jù)庫數(shù)據(jù)視圖
這篇文章主要介紹了MySQL數(shù)據(jù)庫數(shù)據(jù)視圖,視圖是原始數(shù)據(jù)庫數(shù)據(jù)的一種變換,是查看表中數(shù)據(jù)的另外一種方式,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08
Linux mysql命令安裝允許遠(yuǎn)程連接的安裝設(shè)置方法
對大家推薦很好使用的Linux mysql系統(tǒng),像讓大家對Linux mysql系統(tǒng)有所了解,然后對Linux mysql系統(tǒng)全面講解介紹,希望對大家有用今天特意配置了mysql apache php ,雖然網(wǎng)上很多這方面的例子,但是很多是作者再回憶寫的,所以難免有筆誤的地方。2010-08-08
Navicat遠(yuǎn)程連接SQL Server并轉(zhuǎn)換成MySQL步驟詳解
最近遇到一個(gè)需求是將SQL Server轉(zhuǎn)換為 MySQL的格式,由于不想在本地安裝 SQL Server,所以決定在遠(yuǎn)程的 Windows 服務(wù)器上安裝,并在本地使用Navicat遠(yuǎn)程連接它,然而在實(shí)現(xiàn)過程中遇到了諸多問題,記錄于此。感興趣的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。2017-01-01
MYSQL數(shù)據(jù)庫導(dǎo)入數(shù)據(jù)時(shí)出現(xiàn)亂碼的解決辦法
我是用的最后一種方法,前面三種解決MYSQL導(dǎo)入數(shù)據(jù)亂碼的方法沒試過,東莞SEO推薦大家直接使用第四種方法處理MYSQL導(dǎo)入中文數(shù)據(jù)時(shí)的亂碼問題。2011-01-01
mysql函數(shù)split功能實(shí)現(xiàn)
mysql 5.* 的版本現(xiàn)在沒有split 函數(shù),但有些地方會(huì)用,在這里就簡單記錄一下2012-09-09

