背景
項目中遇到一個需求,要求查處菜單節點的所有節點,在網上查了一下,大多數的方法用到了存儲過程,由于線上環境不能隨便添加存儲過程,
準備
創建menu表:
1
2
3
4
5
6
7
8
|
CREATE TABLE `menu` ( `id` int (11) NOT NULL AUTO_INCREMENT COMMENT '菜單id' , `parent_id` int (11) DEFAULT NULL COMMENT '父節點id' , `menu_name` varchar (128) DEFAULT NULL COMMENT '菜單名稱' , `menu_url` varchar (128) DEFAULT '' COMMENT '菜單路徑' , `status` tinyint(3) DEFAULT '1' COMMENT '菜單狀態 1-有效;0-無效' , PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=12212 DEFAULT CHARSET=utf8; |
插入數據:
1
2
3
4
5
6
7
8
9
10
11
|
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' ); |
得到的目錄結構如下圖所示:
查詢
先貼出sql語句:
比如,要查詢菜單節點12的所有子節點,則查處的結果為:
分析
首先分析from后面的語句,根據parent_id和id 排序,并將要查詢的菜單節點當做變量,from后面的結果為
接下來看if(express1,express2,express3)條件語句,if語句類似三目運算符,當exprss1成立時,執行express2,否則執行express3;
FIND_IN_SET(str,strlist),str 要查詢的字符串,strlist 字段名 參數以”,”分隔 如 (1,2,6,8),查詢字段(strlist)中包含(str)的結果,返回結果為null或記錄
如果parent_id 在@pid中,則將@pid 里面再加上parent_id,按行依次執行,執行過程如下表所示:
這時,顯示的id就是菜單id為12的所有子節點id
到此這篇關于mysql 遞歸查找菜單節點的所有子節點的文章就介紹到這了,更多相關mysql 遞歸查找菜單節點內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/rainydayfmb/p/8028868.html