论SQL语句中的Left join-多表关系

版权声明: https://blog.csdn.net/taotaojs/article/details/78816729

论SQL语句中的多表关系


  • 一对多 - 用于去重 - left join 要连接的表 on 唯一字段(标识) = 多字段
  • 一对一 - 用于查询 - left join 要连接的表 on 唯一字段 = 唯一字段
  • 多对一 - 用于分组 - left join 要连接的表 on 多字段 = 唯一字段

以前,被子查询这种语句弄得超迷糊,然后在交大的学习平台上发现原来很多情况都不需要子查询,直接一个where就搞定了,但是并不了解哪些对应关系。

前几天在网上看到一个大神写的SQL,冒出了一个特别神奇的语法:Left join,当时懵了,这是啥?花了好长时间的研究,终于搞清楚了啥是外链接。

但是啊,不知道其他初学者有没有这种感受:看网上哪些例子是非常懂的,然而自己用在项目中,思维却卡机了。无奈之下,我还是继续研究了哪位大神的源码,如下:

SELECT   r.roleid,r.rolename,r.deptid,d.deptname,GROUP_CONCAT(m.menuname SEPARATOR ',' ) menuname
FROM js_role r
LEFT JOIN js_role_menu rm ON r.roleid = rm.roleid
LEFT JOIN js_menu m ON m.menuid = rm.menuid  
LEFT JOIN js_dept d ON d.deptid = r.deptid
GROUP BY r.roleid

注:GROUP_CONCAT(m.menuname SEPARATOR ‘,’ ) - 表示:按组,合并列表中的menuname字段并以’,'分隔

当时要查的四张表,分别是部门表,角色表,角色_菜单表和菜单表,要查出每个角色的权限,以及部门名称。
附上表的数据:

  • js_role表(角色表)

      roleid	rolename		deptid
      1		超级管理员		1
      2		运营主管		 2
      3		运营员			  2
    
  • js_role_menu(角色对应菜单表)

      roleid	menuid
      1		1
      3		1
      2		2
      2		3
      3		2
      1		3
    
  • js_menu(菜单表)

      menuname	menuid
      系统管理	1
      用户管理	2
      菜单管理	3
    
  • js_dept(部门表)

      deptid	deptname
      1		总部
      2		运营部
      3		财务部
    

角色_菜单表就相当于权限表,存放的是角色的id和授权菜单的id。

然后当时写了一个SQL:

SELECT u.username,r.rolename,d.deptname,
	GROUP_CONCAT(m.menuname SEPARATOR ',') menuname 
FROM
	js_dept d,js_role r,js_role_menu rm,js_menu m,js_user u
WHERE d.deptid = r.deptid 
	AND rm.roleid = r.roleid 
	AND m.menuid = rm.menuid 
	AND u.userid = 1
GROUP BY r.roleid 

还是相当轻松的,然后我就结合了两种方法去对比理解了。

记得以前非常在意表的关系,现在明白了,原来表关系都是大相径庭的,接下来我说说他们的关系,以及应用的场景(这是我自己总结出来的规律,因为受限于个人,还望各位大神可以分享宝贵的经验。)

  • 一对一关系:即上表中的【菜单名称】对【菜单id】

    • 用于查询 - left join 要连接的表 on 唯一字段 = 唯一字段
  • 一对多关系

    • 用于去重 - left join 要连接的表 on 唯一字段(标识) = 多字段
  • 多对一关系

    • 用于分组 - left join 要连接的表 on 多字段 = 唯一字段
  • 多对多关系

    • 貌似就是笛卡尔积

PS:第一次发表博客,欢迎大家提出宝贵的意见哟~

猜你喜欢

转载自blog.csdn.net/taotaojs/article/details/78816729