自联接总结

news/2025/1/5 7:01:08/文章来源:https://www.cnblogs.com/zyb-luckey/p/18648863

SELECT am2.*,am.mid as submid,am.menuname as submenuname,am.url as suburl,am.glyphicon as subglyphicon
from admin_menu am
inner join admin_menu am2 on am.pid = am2.mid

用父表pid(父级字段)到子表mid进行匹配,用父表数据进行逐行匹配

1. 表结构

假设有三个表:

  • admin_menu:保存菜单的信息

    midmenunamepidurlglyphicon
    1 菜单管理 0 /menu icon1
    2 子菜单1 1 /sub1 icon2
    3 子菜单2 1 /sub2 icon3
    4 用户管理 0 /user icon4
    • mid:菜单的主键,唯一标识每个菜单。
    • pid:父菜单的 mid,表示该菜单的上级菜单,pid = 0 表示没有父菜单。
  • rel_admin_user_menu:用于存储用户与菜单的关联关系

    miduid
    1 1
    2 1
    3 2
    • mid:菜单的 mid,表示该用户与哪些菜单有关联。

2. 查询解析

这条 SQL 查询实现了从 admin_menu 表中查询所有菜单数据,并通过两次自联接(INNER JOIN)以及与 rel_admin_user_menu 表的关联来筛选出需要的数据。

  • admin_menu amadmin_menu am2 的自联接

    • 这是一个自联接(INNER JOIN),即同一个表 admin_menu 被连接了两次,分别用别名 amam2

    • 连接条件是 am.pid = am2.mid,意味着 am 表中的每个菜单的父菜单(pid)将与 am2 表中的菜单的 mid 字段进行匹配。换句话说,查询通过菜单的父子关系(pidmid)将父菜单与子菜单关联起来。

    • am:表示的是父菜单(一级菜单)。

    • am2:表示的是子菜单(二级菜单)。

  • INNER JOIN rel_admin_user_menu ram

    • 这是与 rel_admin_user_menu 表的联接,用来筛选出与用户相关的菜单。
    • 连接条件是 ram.mid = am.mid,这意味着 该菜单必须在 rel_admin_user_menu 表中与某个用户关联,即该菜单必须是某个用户可访问的菜单。
  • SELECT 子句

    • am2.*:选择 am2 表中的所有字段(即子菜单的所有字段)。
    • am.mid AS submidam.menuname AS submenunameam.url AS suburlam.glyphicon AS subglyphicon:从父菜单(am 表)中选择字段,并且给这些字段起别名(submid, submenuname, suburl, subglyphicon),以便清晰地指示这些字段对应的是父菜单的数据。

3. 查询的实现原理

  1. 自联接(INNER JOIN

    • SQL 中的自联接是通过给同一个表设置两个不同的别名来实现的。在这个查询中,admin_menu am 代表父菜单,admin_menu am2 代表子菜单,am.pid = am2.mid 使得父菜单与子菜单根据父菜单的 pid 字段和子菜单的 mid 字段建立联系。

    • 例如:

      • 如果有一个菜单 mid = 1(菜单管理),其 pid = 0,表示它是父菜单。
      • 如果另一个菜单 mid = 2(子菜单1),其 pid = 1,表示它是父菜单 1 的子菜单。
  2. 联接条件

    • am.pid = am2.mid:父菜单 ampid 必须与子菜单 am2mid 匹配,确保正确地关联父子菜单。
    • ram.mid = am.mid:通过 rel_admin_user_menu 表中的 mid 字段与父菜单的 mid 进行匹配,确保只有与用户关联的菜单才会被选择。
  3. 最终结果

    • 这个查询会返回所有符合条件的父子菜单关系,且查询结果将包含父菜单和子菜单的信息。每个子菜单会显示在结果集中,父菜单的字段(如 mid, menuname, url, glyphicon)会被赋予别名,例如 submid, submenuname, suburl, subglyphicon,以避免字段名冲突。

4. 查询返回的结果

假设查询返回如下结果:

parent_midparent_menunamesub_midsub_menunamesub_urlsub_glyphicon
1 菜单管理 2 子菜单1 /sub1 icon2
1 菜单管理 3 子菜单2 /sub2 icon3

解释:

  • parent_midparent_menuname 是从 am 表(父菜单)中获取的字段。
  • sub_mid, sub_menuname, sub_url, sub_glyphicon 是从 am2 表(子菜单)中获取的字段。
  • am2 表的每一行代表一个子菜单(如 sub_mid = 2 对应 子菜单1sub_mid = 3 对应 子菜单2),并且它们的父菜单(parent_mid = 1)通过 am.pid = am2.mid 关联。

5. 为什么会有父子菜单的重复?

如果查询返回的结果中存在重复的父菜单数据,可能是由于 INNER JOIN 关联导致的。假设一个父菜单有多个子菜单,并且与多个用户关联,查询结果会根据这些关系返回多个记录,且每条记录中可能会出现相同的父菜单数据。MyBatis 或其他 ORM 框架通常会根据 mid 来去重,避免重复创建父对象。

总结

  • 这条查询通过 自联接与关联表的联接 来实现父子菜单的关系。
  • 使用 INNER JOIN 来确保只查询有父菜单且与用户关联的菜单。
  • 通过给父菜单和子菜单的字段起不同的别名,确保在结果中不会出现字段名冲突。
  • 父菜单和子菜单之间的关系通过 pidmid 字段来建立,查询的结果返回父菜单与子菜单的联合数据。

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

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

相关文章

《docker基础篇:8.Docker常规安装简介》包括:docker常规安装总体步骤、安装tomcat、安装mysql、安装redis

《docker基础篇:8.Docker常规安装简介》包括:docker常规安装总体步骤、安装tomcat、安装mysql、安装redis@目录8.Docker常规安装简介8.1 docker常规安装总体步骤8.2安装tomcat8.3 安装mysql8.3.1 docker hub上面查找mysql镜像8.3.2 从docker hub上(阿里云加速器)拉取mysql镜像…

Elasticsearch VS Easysearch 性能测试

压测环境 虚拟机配置 使用阿里云上规格:ecs.u1-c1m4.4xlarge,PL2: 单盘 IOPS 性能上限 10 万 (适用的云盘容量范围:461GiB - 64TiB)vCPU 内存 (GiB) 磁盘(GB) 带宽(Gbit/s) 数量16 64 500 5000 24Easysearch 配置 7 节点集群,版本:1.9.0实例名 内网 IP 软件 vCPU JVM 磁…

win10/win11 用 ncpa.cpl 命令快速打开网络连接

前言:Win11系统配置网络适配器好费劲的,每次都要在设置找半天 得,直接来,快捷键安排1、开始 -> 运行 Win + R 弹出 运行 窗口2、输入命令 ncpa.pcl并回车 3、见证奇迹QQ:1061767621 Q群:215481318

基于爬山法MPPT最大功率跟踪算法的光伏发电系统simulink建模与仿真

1.课题概述 基于爬山法MPPT最大功率跟踪算法的光伏发电系统simulink建模与仿真。2.系统仿真结果3.核心程序与模型 版本:MATLAB2022a 4.系统原理简介最大功率点跟踪(Maximum Power Point Tracking, MPPT)是光伏发电系统中至关重要的技术,用于确保光伏电池在其工作条件下输出最…

网络_网络分层模型和应用协议

本文主要介绍了网络的分层模型和应用层的协议,分层模型有四层、七层、五层这几种模型,应用层协议主要涉及 URL 和 HTTP,并且介绍了请求和响应以及他们的行、头、体网络分层模型和应用协议 分层模型 为了解决复杂问题往往分层 经过不断的演化,网络最终形成了五层模型:MAC像…

1.2 可压缩流:激波和膨胀扇

1.2 可压缩流:激波和膨胀扇 前言 欢迎观看《Bang Dream! Ave mujica》,一部超好看的少女乐队动漫,从2025.1.2开始,每周四晚10点更新。 哇嘎利马斯 大量玩梗注意 AA笔记主要参考刘永学主编《空气动力学》,讲的物理概念很清晰易懂,推荐给大家。 扰动的传播 接下来我们讨论扰…

使用ClosedXML实现Excel导入导出

使用ClosedXML实现Excel导入导出 写在开头 游览Dotnet 基金会中的项目时,发现了这个库,Github 链接,它的性能非常好,详细见下图话不多说,直接上代码吧! 导出 后端: public static byte[] Output<T>(List<T> data, string sheetName) {using var workbook = …

离线环境一步部署OCR文字识别程序

前言 百度、阿里等的OCR接口需要联网环境,并且超过免费/试用次数后需要付费。一般政务项目因为信息安全要求都部署在独立内网,有没有离线免费的OCR实现方案?下文基于EasyOCR实现一步部署,可下载直接使用。 EasyOCR EasyOCR支持离线部署,可免费使用(支持Apache-2.0 licens…

昆明理工大学25届MBA复试资料

昆明理工大学25届MBA复试资料介绍 昆明理工大学MBA工商管理考研复试群:679724235 作者:唐维康 QQ1352517362 包含内容 全部内容如下:01、往年面试真题分为了专业知识问答、英语口语、社会类问题、综合面试问题四类,为去年上岸的面试题。02、专业英语词汇05、MBA复试1V1辅导课…

Alexander ——2024年报

Alexander ——2024年报Alexander ——2024年报 小总结 知己知彼,百战不殆。2024下半年找到了自己学习的方向,也认识很多的师傅,深入领域学习,无时不刻不在CTF的路上,逐渐建立一个完整的知识库体系。 今年的成长变化与进步 所学习的知识 Misc大部分编码体制皮亚诺夫曲线,希伯…

2025 多校冲刺省选模拟赛 1

第一次!输输输!2025 多校冲刺省选模拟赛 1 切割蛋糕(cake) 签到题 本质上是求 \(a\) 序列最小满足所有前缀平均值均大于全局平均值的循环位移,考虑 Raney 引理,找到斜率 \(\dfrac{s}{n}\) 所经过截距最小的点,易知没有无解情况。 时间复杂度 \(O(n)\)。 游乐园(park) …

IntelliJ IDEA 2024 安装激活详细使用教程(激活至2026,实测是永久,亲测!)

开发工具推荐:IntelliJ IDEA 2024 安装激活详细使用教程(激活至2026,实际上永久,亲测!)申明:本教程 IntelliJ IDEA补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 !卸载老版本 IDEA 首先,如果小伙伴的…