使用MySQL应该会知道这个数据库是不支持直接递归查询的,Oracle connect by支持
下面记录我在项目中遇到的这个没有递归查询的解决方法
先贴出一张图,一个简单的用户-角色-菜单的查询sql,SQL中传有两个参数请注意,当然也可以只传入一个用户id即可,但是需要多关联一些表,这里已简单的方式做.
由下图可以很清楚看出来查出来的菜单数据本身就是有层级关系的(排序id暂时未加入sql),那么我们怎样已递归层级的方式返回给前端呢(我的程序是采用前后端分离的,如果是一体式可是借用tree组件实现),下面是我们要解决的问题
一般情况都会带有排序id对菜单进行排序,下面我们说下加入排序id的情况:
如果使用了排序id可以直接使用,但是需要注意排序id必需要有一定规则,不能让SQL查询出的数据出现混乱,应该还有层级关系
扩展一个网上的小案例:
- CREATE FUNCTION getPriority (inID INT) RETURNS VARCHAR(255) DETERMINISTIC
- begin
- DECLARE gParentID INT DEFAULT 0;
- DECLARE gOderID INT DEFAULT 0;
- DECLARE gPriority VARCHAR(255) DEFAULT '';
- SELECT PARENT_ID,MENU_ORDER INTO gParentID,gOderID FROM sys_menu WHERE MENU_ID = inID;
- if gParentID > 0 then
- SET gPriority = CONCAT(gOderID,inID);
- else
- SET gPriority = inID;
- end if;
- WHILE gParentID > 0 DO /*0为根*/
- SET gPriority = CONCAT(gParentID, '.', gPriority);
- SELECT PARENT_ID INTO gParentID FROM sys_menu WHERE MENU_ID = gParentID;
- END WHILE;
- RETURN gPriority;
- end
第二步:执行一下函数,就会得到你想要的结果,注意,MENU_ID 为数据库字段名。
- SELECT * FROM sys_menu ORDER BY getPriority(MENU_ID)
下面提供两个参考资料实现层级关系
http://blog.csdn.net/lchq1995/article/details/78913912
http://awen7916.iteye.com/blog/2254833