MySQL实现菜单递归查询

时间:2024-03-21 18:54:53

使用MySQL应该会知道这个数据库是不支持直接递归查询的,Oracle connect by支持

下面记录我在项目中遇到的这个没有递归查询的解决方法

先贴出一张图,一个简单的用户-角色-菜单的查询sql,SQL中传有两个参数请注意,当然也可以只传入一个用户id即可,但是需要多关联一些表,这里已简单的方式做.

由下图可以很清楚看出来查出来的菜单数据本身就是有层级关系的(排序id暂时未加入sql),那么我们怎样已递归层级的方式返回给前端呢(我的程序是采用前后端分离的,如果是一体式可是借用tree组件实现),下面是我们要解决的问题

MySQL实现菜单递归查询


MySQL实现菜单递归查询

一般情况都会带有排序id对菜单进行排序,下面我们说下加入排序id的情况:

如果使用了排序id可以直接使用,但是需要注意排序id必需要有一定规则,不能让SQL查询出的数据出现混乱,应该还有层级关系

MySQL实现菜单递归查询


扩展一个网上的小案例:

  1. CREATE FUNCTION getPriority (inID INTRETURNS VARCHAR(255) DETERMINISTIC  
  2.   begin  
  3.     DECLARE gParentID INT DEFAULT 0;  
  4.     DECLARE gOderID INT DEFAULT 0;  
  5.     DECLARE gPriority VARCHAR(255) DEFAULT '';  
  6.      
  7.     SELECT PARENT_ID,MENU_ORDER INTO gParentID,gOderID FROM sys_menu WHERE MENU_ID = inID;  
  8.   
  9.     if gParentID > 0 then   
  10.     SET gPriority = CONCAT(gOderID,inID);  
  11.     else   
  12.     SET gPriority = inID;  
  13.     end if;       
  14.            
  15.     WHILE gParentID > 0 DO  /*0为根*/  
  16.       SET gPriority = CONCAT(gParentID, '.', gPriority);  
  17.       SELECT PARENT_ID INTO gParentID FROM sys_menu WHERE MENU_ID = gParentID;  
  18.     END WHILE;   
  19.     RETURN gPriority;  
  20.   end 
点击运行之后,就会出现如下信息,点击函数就会出现刚刚创建的函数,如果没有显示,点击右键刷新一下就会显示出来。

第二步:执行一下函数,就会得到你想要的结果,注意,MENU_ID 为数据库字段名。

  1. SELECT  *  FROM  sys_menu  ORDER BY  getPriority(MENU_ID) 

下面提供两个参考资料实现层级关系

            http://blog.csdn.net/lchq1995/article/details/78913912

            http://awen7916.iteye.com/blog/2254833