首页 > 其他分享 >自联接总结

自联接总结

时间:2025-01-02 22:41:48浏览次数:1  
标签:总结 联接 admin menu am mid 菜单 am2

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 字段来建立,查询的结果返回父菜单与子菜单的联合数据。

标签:总结,联接,admin,menu,am,mid,菜单,am2
From: https://www.cnblogs.com/zyb-luckey/p/18648863

相关文章

  • 2024 OI 总结
    OI年度总结2024高考年没怎么学OI,放几个大伙知道的:洛谷写下了\(52.36kb\)代码,通过\(18\)道题。最高等级分\(0\)分,超越\(0\%\)的用户(赢麻了✌)!关键词:科学探索Codeforces通过\(201\)道题,打了\(13\)场比赛,其中\(1\)场排名赛。Rating变化:\(2184->2182\),......
  • 【初阶数据结构与算法】排序算法总结篇(每个小节后面有源码)(直接插入、希尔、选择、堆
    文章目录一、直接插入排序二、希尔排序三、直接选择排序四、堆排序五、冒泡排序六、快速排序七、归并排序八、计数排序九、非递归快速排序十、非递归归并排序本篇内容将从稳定性与复杂度等角度分析排序算法,列出它们的特点、优点以及缺点,希望大家有所收获,如果想更加细......
  • 线段树总结
    线段树你说的对,但线段树是一种用\(O(n\cdotlog\n)\)的大常数复杂度+略微的卡常下技巧=AC的妙妙数据结构。线段树是基于分治与二叉树的在线工具,可以维护区间信息,但比树状数组能够维护的东西更多。线段树虽然能够维护的东西更多,但也有一些特别显著的缺点:代码量过长。......
  • Openwrt 下SRS编译安装及配置使用问题总结
    Openwrt下SRS编译安装及配置使用问题总结基本概念应用背景Openwrt安装SRS方案方案一:交叉编译(失败,不推荐)方案二:目标板编译(编译成功,运行失败,不推荐)安装依赖源码安装问题解决Buildingopenssl-1.1-fit.Can'tlocateFindBin.pmin@INC(youmayneedto......
  • 软件工程个人总结
    一、学期回顾1.1回顾你对于软件工程课程的想象根据你对课程目标和期待,回顾目前的所学所练所得,在哪些方面达到了你的期待和目标,哪些方面还存在哪些不足,为什么?达成的目标与期待理论与实践结合:课程的最大目标之一是将软件工程的理论知识应用到实践中。在这一点上,我收获颇丰。......
  • 2024年度总结
    成长某种程度上就意味着从与别人的互动中不断学习如何客观地看待自己。——安格斯·班克罗夫特《米拉的猜想》注:全文充斥着笔者的碎碎念,毫无阅读价值人生到处知何似,应似飞鸿踏雪泥。​​从哪里开始讲起呢,。。。。没有感觉,点个music,这样稍微有点感觉了现在是:20......
  • czsl总结
    解耦式FromRedWinetoRedTomato:CompositionwithContext(2017)问题:现有的视觉识别方法缺乏对组合性和上下文的建模。组合性是指通过组合已知概念来生成新的复杂概念。上下文是指概念的含义会随着环境的不同而改变。创新点:提出了一种直接在模型空间中推理来组合视觉......
  • 关于此题E - Maximize XOR(Atcoder ABC 386)搜索技巧的一些总结
    传送门题目要求n个数中选k个数异或起来最大,我们想到字典树中最大异或和这一经典问题,但是很明显字典树只能解决任选两个数的最大异或,而此题是任选k个,那我们走投无路只能考虑爆搜。首先可以很容易写出一个暴力的搜索:voiddfs1(longlongpos,longlongsum,longlongkk){i......
  • 2024个人总结
    眼睛一睁一闭,一年又过去了,小小总结一下个人的2024构建了某某跨平台电商工具站点后端核心尽事在人,成事在天,主体架构构建不孬,吾亦算尽忠职守偏处吾编码也随事之变化不断磨砺改造工具利剑,某些经验也总结成了库sv.db和几篇文章,不算多强,只是为自己工作省事不少略微遗憾基于ope......
  • 【JAVA 面试题总结】
    JAVA面试题总结一、Java基础语法部分面试题1:Java中public、private、protected和默认(无修饰符)这几种访问修饰符的区别是什么?答案:public:可以被任何类访问,不管是否在同一个包内。private:只能在当前类内部访问,对外部类完全隐藏。protected:在同一个包内的类以及不同包......