首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql连接5个表

mysql连接5个表
EN

Stack Overflow用户
提问于 2014-05-27 22:45:32
回答 1查看 2.5K关注 0票数 0

伙计们,我这里有五个表--会话、用户、users_2_groups、permissions_attribute和权限。为了简化,让我们考虑:

  • sessions表有两列: sid和userid。
  • users表有两列: userid和user_type_id
  • users_2_groups有两列: userid和usergroupid
  • permissions_attribute有两列: perm_att_id和perm_att_label
  • 权限表有五列: perm_att_id、perm_appendto、perm_appendid和permission_value。

我创建了一个查询来检查用户是否通过iduserid、groupusergroupid和typeuser_type_id拥有正确的权限,并且它工作得很好,但是对于一个权限,我想修改我的查询,以支持检查一个或多个权限。下面是我的查询,它支持一个权限:

代码语言:javascript
复制
SELECT p.permissionid,f.userid,f.user_type_id,t.perm_att_id,t.perm_att_label,p.permission_value 
FROM 
(SELECT s.userid AS userid,u.user_type_id FROM sessions s,users u WHERE s.sid='f7b24e6cc4f9325c946d7c4522411ab1' AND u.userid=s.userid) AS f 
JOIN permissions_attribute AS t ON t.perm_att_label='show-dashboard'
JOIN permissions AS p ON (p.perm_att_id=t.perm_att_id AND p.perm_appendto='user' AND p.perm_appendid=f.userid AND p.permission_value=1)
OR (p.perm_att_id=t.perm_att_id AND p.perm_appendto='type' AND p.perm_appendid=f.user_type_id AND p.permission_value=1)
OR (p.perm_att_id=t.perm_att_id AND p.perm_appendto='group' AND p.perm_appendid IN (SELECT usergroupid FROM users_2_groups  WHERE userid=f.userid ) AND p.permission_value=1)

更新:权限模块的工作方式如下:

  • 按会话id从会话表中选择userid
  • 从permissions_attribute表中获取我们需要检查的权限,其中perm_att_label列保存权限名称(在我的代码中,它只支持一个权限,但我需要使它支持多个权限)。
  • 我们可以通过三种方式将权限分配给用户:

代码语言:javascript
复制
- by assigned permissions to the user directly [userid]
- by assigned permissions to the group [usergroupid]
- by assigned permissions to the user type [user\_type\_id] when i check for a permissions, query shall be search for them into all three way [user,group and type]. now i need to pass tow or more permissions label [perm\_att\_label] to check if its assigned or not?

我说清楚了吗?提前感谢您的帮助。

EN

回答 1

Stack Overflow用户

发布于 2014-05-27 23:13:32

查询的可读性很低。在编写sql查询时要记住以下几点:

  1. 不要使用隐式联接(如sessions s,users u)。这种语法通常是不赞成的。
  2. 避免使用SELECT (...) FROM (SELECT ... FROM)构造。这对可读性来说是很糟糕的。如果必须从其他查询中选择某些内容,请使用WITH。但是,在这种情况下,我看不出你需要这个的任何理由。
  3. 当连接表时,通常只在ON子句中添加联接列。将WHERE子句用于更一般的约束(如s.sid='f7b24e6cc4f9325c946d7c4522411ab1' )
  4. 尽量避免不必要的重复代码。在这个查询中,您重复了很多条件,例如p.permission_value=1

考虑到这一点,我重写了您的查询。然而,你的问题的解决方案似乎相当琐碎。有什么理由不能这样做吗?

代码语言:javascript
复制
SELECT p.permissionid, u.userid, u.user_type_id, t.perm_att_id, t.perm_att_label, p.permission_value
FROM sessions s
INNER JOIN users u ON u.userid=s.userid
INNER JOIN permissions_attribute t ON t.perm_att_label='show-dashboard'
INNER JOIN permissions AS p ON p.perm_att_id=t.perm_att_id
WHERE s.sid='f7b24e6cc4f9325c946d7c4522411ab1'
AND p.permission_value IN (1,2,3,...) -- <- have you tried this?
AND ((p.perm_appendid=u.userid AND p.perm_appendto IN ('user','type'))
  OR (p.perm_appendto='group' AND p.perm_appendid IN 
        (SELECT usergroupid FROM users_2_groups WHERE userid = u.userid);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23900144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档