sql 没有调试 菜单_MySQL递归查询上下级菜单

正文

在传统的后台管理系统里面经常会需要展示多级菜单关系,今天我们来学一下如何使用一条SQL语句展示多级菜单。

现在我们有一张corpinfo单位表,里面有一个belong字段指向上级单位,首先来看一下现在表里有什么数据:

SELECT uid,ubelong FROM corpinfo

7e17e1f126a5f04bad9912acb4f9eab9.png

现在是类似下面这样的一个三级菜单,uid为1的是我们的顶级菜单,ubelog为0

297e3dc5b2b242925bcf77109040dae8.png

现在我们想实现传入一个 uid ,把当前 uid 和其下级单位的 uid 都展示出来,当然我们可以使用代码或者网上常见的存储过程来实现,但是今天我们用一条SQL语句来实现该效果:

先来看看我们的SQL语句

SELECT DATA.uid FROM(SELECT@ids AS _ids,(SELECT @ids := GROUP_CONCAT(uid)FROM corpinfoWHERE FIND_IN_SET(ubelong, @ids)) AS cids,@l := @l+1 AS levelFROM corpinfo, (SELECT @ids := (参数) , @l := 0 ) bWHERE @ids IS NOT NULL) ID, corpinfo DATA
WHERE FIND_IN_SET(DATA.uid, ID._ids)
ORDER BY level,uid

看下执行结果:

bcb3def39cbbf12ae59354cf73387adf.png

可以看到传入 uid 为 1 后,列出了 uid 为 1 的所有下级单位,连第三级的菜单也列出来了。

57dec0dd8385951b8dc9fc33d2f48cf8.png

比较核心的有下面几个地方:

f2f5c83887e32b78fbda1d3d4068a3bc.png

GROUP_CONCAT()函数

前言:在有 group by 的查询语句中,select指定的字段要么就包含在 group by 语句的后面,作为分组的依据,要么就包含在聚合函数中。

假设我们有一张 user 用户表,我们想查看名字相同的用户的最小年龄,可以这样写:

SELECT name,age FROM user GROUP BY name

执行结果为:

bbf99fa4e732f4929bf2bc5d9594bfe1.png

现在我们想查询 name 相同的用户的所有年龄,当然我们可以这样写:

SELECT name,age FROM user ORDER BY name

执行结果为:

947b9151c6a03109d0debde2b0919b96.png

但是这样同一个名字出现多次,看上去非常不直观。有没有更直观的方法,既让每个名字都只出现一次,又能够显示所有的名字相同的人的id呢?——使用 GROUP_CONCAT() 函数

功能: group by 产生的同一个分组中的值连接起来,返回一个字符串结果。

语法:GROUP_CONCAT( [distinct] 要连接的字段 [ORDER BY 排序字段 ASC/DESC ] [separator '分隔符'] )

SELECT name,GROUP_CONCAT(age) FROM user GROUP BY name

执行结果为:

36c773a2a03e917c111284e822cb796f.png

可以看到相同用户名的年龄都放到一起了,以逗号分割。

FIND_IN_SET函数

假设我们有一张 book 书籍表,有书名和作者两个字段:

SELECT name,author FROM book

执行结果为:

0ed7016c6aee5c92514532cc9d839e56.png

现在我们想查作者包含 小A 的书籍,我们来试一下:

SELECT name,author FROM book WHERE author IN ('小A')

执行结果为:

d72a1f32b9b65021aa5e7fada4727c9c.png

实际上这样是不行的,这样只有当 author 字段的值等于'小A'时(和IN前面的字符串完全匹配),查询才有效,否则都得不到结果。

可能你会想到用LIKE实现,我们来试试看:

SELECT name,author FROM book WHERE author LIKE '%小A%';

执行结果为:

db11ec6f37bf4c7a6927477e0b75f81b.png

可以看到把小AA的书籍也查出来了,所以用LIKE无法实现该功能。

那么我们如何使用 FIND_IN_SET 函数来实现呢?

SELECT name,author FROM book WHERE FIND_IN_SET('小A',author);

执行结果为:

0064c1232c27bdba4416555a74a2d3f6.png

语法:FIND_IN_SET(str,strlist)

str :要查询的字符串strlist :字段名 参数以”,”分隔 如 (1,2,6,8)
查询字段(strlist)中包含(str)的结果,返回结果为null或记录

知道了这两个函数后,现在回过头来看看前面的SQL语句:

77fc08a67b32c4119824054704e572c8.png

运行选中的代码后可以看到列出了上下级的关系,至于细节这里不再展开描述。

既然我们能查出当前单位的所有下级单位,那么应该也能查询所有上级单位,来看下SQL:

SELECT uid FROM(SELECT@id AS _id,( SELECT @id := ubelongFROM corpinfoWHERE uid = @id) AS _pid,@l := @l+1 as levelFROM corpinfo,(SELECT @id := (参数), @l := 0 ) bWHERE @id > 0) ID, corpinfo DATAWHERE ID._id = DATA.uidORDER BY level DESC

还是我们的corpinfo单位表,执行结果为:

40cdafb07d53c21f579566565bc0eab6.png

可以看到当输入 uid 为 5 时,列出了当前单位及其上级所有单位,SQL和上面的差不多,这里不再细说。

最后补充一段代码,既然我们已经拿到想要的单位编号了,接下来就是要递归构建我们的单位树了,来看下代码:

/*** 递归将模块树构建成JSON数组*/
private JSONArray getJsonArray(List<ClCorpinfo> list) {Map<Integer, List<ClCorpinfo>> map = new HashMap<>(16);List<ClCorpinfo> sonList;for (ClCorpinfo clCorpinfo : list) {if (map.get(clCorpinfo.getUbelong()) != null) {sonList = map.get(clCorpinfo.getUbelong());} else {sonList = new ArrayList<>();}sonList.add(clCorpinfo);map.put(clCorpinfo.getUbelong(), sonList);}JSONArray array = new JSONArray();if (list.size() > 0) {array = getChildrenTree(map, 0, 0);}return array;
}
/*** 递归构建模块树的子类*/
public JSONArray getChildrenTree(Map<Integer, List<ClCorpinfo>> map, Integer uparentid, Integer level) {JSONArray array = new JSONArray();for (ClCorpinfo clCorpinfo : map.get(uparentid)) {JSONObject obj = new JSONObject();obj.put("uid", clCorpinfo.getUid());obj.put("ubelong", clCorpinfo.getUbelong());obj.put("ucorpname", clCorpinfo.getUcorpname());obj.put("uparentname", clCorpinfo.getUparentname());if (map.get(clCorpinfo.getUid()) != null) {level++;obj.put("children", getChildrenTree(map, clCorpinfo.getUid(), level));} else {obj.put("children", null);}array.add(obj);}return array;
}

上面这段戴安只要传入单位集合,接下来会递归来构建我们的单位树,接下来只要前端渲染上去就完事了。

总结

其实网上也有很多其它的解决方案,比如用代码实现,也可以用存储过程实现,今天我们使用SQL语句来实现并不一定是最好的办法,虽然简单但是比较难懂,我这边只是给大伙提供一个可行的方案,如果有什么不对的地方请多多指教。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 桥 word_java导出word的6种方式(转发)

最近做的项目&#xff0c;需要将一些信息导出到word中。在网上找了好多解决方案&#xff0c;现在将这几天的总结分享一下。目前来看&#xff0c;java导出word大致有6种解决方案&#xff1a;1&#xff1a;Jacob是Java-COM Bridge的缩写&#xff0c;它在Java与微软的COM组件之间构…

jieba 词典 词频_在Hanlp词典和jieba词典中手动添加未登录词

在使用Hanlp词典或者jieba词典进行分词的时候&#xff0c;会出现分词不准的情况&#xff0c;原因是内置词典中并没有收录当前这个词&#xff0c;也就是我们所说的未登录词&#xff0c;只要把这个词加入到内置词典中就可以解决类似问题&#xff0c;如何操作呢&#xff0c;下面我…

python爬取汽车之家_python爬取 汽车之家(汽车授权经销商)

一&#xff1a;爬虫的目标&#xff1a;打开汽车之家的链接&#xff1a;https://www.autohome.com.cn/beijing/&#xff0c;出现如下页面我们的目标是点击找车&#xff0c;然后出现如下图我们要把图中的信息抓取到二&#xff1a;实现过程我们选择 宝马5系 然后点击找车注意宝马…

Java 调用 Caffe_解决 free(): invalid pointer: 0x00000000019ff700 运行时报错(caffe)(libtool使用)...

编译成功&#xff0c;运行时报错&#xff1a;在使用 pytorch or tensorflow or caffe 时&#xff0c;都可能存在这个问题&#xff1a;*** Error in xxx: free(): invalid pointer: 0x00000000020663b0 ***很可能是缺少libtcmalloc库解决方法1&#xff1a;apt-get安装libtcmallo…

unity 世界坐标间角度_Unity学习笔记—本地坐标转世界坐标

核心用到的方法就是transform.TransformPoint( )这个方法的返回值就是Vector3类型的世界坐标&#xff0c;transform就是相对的物体&#xff0c;括号里的就是相对这个transform的本地坐标&#xff0c;比方说我现在的位置吧&#xff0c;知道我相对于我的邻居的坐标:Pos1&#xff…

webcomponents安装了没有用_Web Components 入门实例教程

来源 | http://www.ruanyifeng.com/blog/2019/08/web_components.html组件是前端的发展方向&#xff0c;现在流行的React和Vue都是组件框架。谷歌公司由于掌握了Chrome浏览器&#xff0c;一直在推动浏览器的原生组件&#xff0c;即Web组件API。部分第三方框架&#xff0c;原生组…

虹软java接摄像头_虹软人脸识别SDK(java+linux/window) 初试

虹软人脸识别全平台demo调用—快速上手之服务端Windows篇demo名称&#xff1a;ArcFace 2.2 Windows(86) Demo [C]一 环境配置&#xff1a;1) 安装VS2013环境安装包(vcredist_x86_vs2013.exe)2) 从官网(http://www.arcsoft.com.cn/ai/arcface.html)申请sdk&#xff0c;下载对应的…

java 循环查询list_Java用list储存,遍历,查询指定信息过程详解

需求说明实现思路见代码注释代码内容使用list储存&#xff0c;遍历&#xff0c;查询&#xff0c;删除import java.util.ArrayList;import java.util.List;/*** auther:&#xff1a;9527* Description: 第七题* program: 多线程* create: 2019-08-09 23:39*/public class Sevent…

低代码开发平台_低代码开发平台系列:6、低代码是编程技术发展大势所趋

一、低代码是一种编程技术低代码是快速开发工具/技术的一种&#xff0c;属于软件开发/编程工具/技术领域&#xff0c;主要应用于企业软件开发领域。借助低代码工具&#xff0c;使用者无需编码即可实现企业软件系统常见功能的交付&#xff1b;少量编码扩展更多功能&#xff0c;相…

abnf java实现_详细讲解如何利用Java实现组合式解析器?

简介&#xff1a;Ward Cunningham 曾经说过&#xff0c;干净的代码清晰地表达了代码编写者所 想要表达的东西&#xff0c;而优美的代码则更进一步&#xff0c;优美的代码看起来就像是专门为了 要解决的问题而存在的。在本文中&#xff0c;我们将展示一个组合式解析器的设计、实…

充电原理_电动汽车充电桩如何设置?充电桩原理介绍

随着新能源产业的蓬勃发展&#xff0c;电动汽车在生活中变得越来越普遍。比亚迪(BYD)&#xff0c;宝马(BMW)和特斯拉(Tesla)等汽车制造商都已经推出了全电动汽车&#xff0c;而混合动力汽车则更为普遍。为了能够方便地为这些电动汽车的电池充电&#xff0c;必须建立充电桩。充电…

java 获取服务器硬件_dell服务器远程获取硬件状态

以dell的R620型号的服务器做的测试登陆上dell服务器ilo的IP地址&#xff0c;首先打开ipmi&#xff0c;ilo2是直接支持ipmi2.0的此框需要点击 “IDRAC设置”->“网络”->“IPMI设置”在”启用LAN上IPMI“后的复选框打钩&#xff0c;才能启动ipmi好像是内置到了ilo2&#x…

简单可行性报告模板_项目可行性报告模板分享!第三章主要内容

项目可行性报告模板分享!第三章主要内容如下&#xff1a;第三章 市场分析与建设规模市场分析在可行性研究中的重要地位在于&#xff0c;任何一个项目&#xff0c;其生产规模的确定、技术的选择、投资估算甚至厂址的选择&#xff0c;都必须在市场需求情况有了充分的了解后才能解…

java外挂源码_2.7 万 Star!Github 项目源码辅助阅读神器

【导语】&#xff1a;一款用于将 Github 项目代码以树形格式展示的浏览器插件。简介大家平时逛 GitHub 是否会觉得查看源代码的体验十分糟糕&#xff1f;项目文件需要一层层点击&#xff0c;返回也要一层层返回。这样不直观&#xff0c;也比较麻烦。Octotree 是一款辅助阅读 Gi…

php教育网站设计案例_酒店装修,精品酒店设计装修案例,酒店设计网站

酒店设计需要考虑&#xff1a;设计酒店的时候也要顺应市场潮流&#xff0c;不再单一的提供休息、洗漱、睡觉的空间&#xff0c;还要能提供社交、商务等功能&#xff0c;同顾客产生情况共鸣。这样能够引领生活方式的、能够互动&#xff0c;有仪式感的酒店&#xff0c;是很吸引人…

写一个方法判断一个字符串是否对称_判断一个男生是否好色的方法

▾我们店只招黑喵哦?▾其实也不是不能理解为什么男的要跑?▾有什么相见恨晚的小知识&#xff1f;?▾见证奇迹?&#xff1a;是不是穿过去了&#xff01;&#xff1f;▾医学奇迹?▾卧槽流劈&#xff01;?真的超光速了&#xff01;▾细节很到位啊几位少年?▾昨有坟头蹦迪?…

matlab计算联合熵,如何用matlab软件计算一幅图像信息的熵以及两幅图像间的联合熵?...

%计算一副图像的熵%随机生成图像Afloor(rand(8,8).*255);[M,N]size(A);tempzeros(1,256);%对图像的灰度值在[0,255]上做统计for m1:M;for n1:N;if A(m,n)0;i1;elseiA(m,n);endtemp(i)temp(i)1;endendtemptemp./(M*N);%由熵的定义做计算result0;for i1:length(temp)if temp(i)0;…

自然水体辐射特性与数值模拟 pdf_OpenGMS系列讲座(十三)汪亚平教授:南黄海水动力过程和辐射沙脊群演化...

2020年8月28日&#xff0c;南京大学海岸与海岛开发教育部重点实验室汪亚平教授应地科院陈旻教授邀请&#xff0c;作客南京师范大学虚拟地理环境教育部重点实验室OpenGMS系列讲座&#xff0c;并做了题为"南黄海水动力过程和辐射沙脊群演化" 的报告。汪教授首先通过两个…

matlab2014a 3d标定,[转载]张的matlab摄像机标定

自己写了下matlab张的标定程序&#xff0c;采用张正有网站上的数据&#xff0c;即数据文档Model.txt data1.txt data2.txtdata3.txt data4.txt data5.txt。其中Model.txt为世界坐标系中的点【实验结果】我的程序&#xff1a;k1 -0.2286 k2 0.1903 fx 832.5000fy 832.5298 cx 30…

小括号教学设计导入_【教资面试】语文政治历史地理教学设计答题技巧!

语文1.确立教学目标的依据 (1)基础教育课程改革课程改革要求语文课程必须面向全体学生&#xff0c;使学生获得基本的语文素养。对知识与技能&#xff0c;过程与方法&#xff0c;情感态度与价值观三个方面目标的整合&#xff0c;是语文新课程的价值追求。 根据语文学科工具性与人…