繁体   English   中英

Mysql加入,检查用户是否拥有/没有权限

[英]Mysql Join, check if user has / has no permission

尝试使用单个查询执行此操作,但希望获得有权执行x的所有用户的列表。 这涉及到用户表和权限表。 但看起来我使用的任何连接都不关心where语句(因为用户通常会在表中有另一个权限)

SELECT DISTINCT `u`.*
FROM (`system_users` AS u)
JOIN `system_user_permissions` AS p ON `u`.`id` = `p`.`user`
WHERE `p`.`permission` != 2
AND `p`.`permission` != 3  

我有大约3900个用户,我应该收到大约2000个与权限ID 2或3都不相关的用户。但是仍然获得3900问题是因为该用户也可能与权限1,5,6相关...在将它们组合在一起后放入列表中。

有什么建议么?


更新了查询,但仍然没有运气。 如果我为每个输出“许可”,我没有得到2或3,列出的用户仍然可以在那里获得该许可

SELECT DISTINCT `u`.*, `p`.`permission`
FROM (`system_users` AS u)
INNER JOIN `system_user_permissions` AS p ON `u`.`id` = `p`.`user`
WHERE `p`.`permission` NOT IN (2, 3)   

这样就可以了:

SELECT * FROM system_users AS u 
        WHERE NOT EXISTS(
            SELECT 1 FROM system_user_permissions AS p
            WHERE u.id = p.user
            AND p.permission IN (2,3)
)

not exists希望not exists

select
   *
from
   system_users u
where
   not exists (
       select 
           1 
       from 
           system_user_permissions p 
       where 
           p.id = u.user 
           and p.permission in (2,3)
   )

您的所有原始查询所做的是否定任何只有权限2或3,而不是1,2和5(这是您想要的)的用户。 一旦在该用户的system_user_permissions找到权限2或3, not exists将抛出该用户。

您可以采用相反的方式,指定哪些用户不应出现在列表中,如下所示:

SELECT DISTINCT `u`.*
FROM (`system_users` AS u)
JOIN `system_user_permissions` AS p ON `u`.`id` = `p`.`user`
WHERE `p`.`user` NOT IN
  (SELECT DISTINCT `user`
   FROM `system_user_permissions`
   WHERE `permission` = 2 OR `permission` = 3);

使用NOT IN关键字选择一组您不想返回的值。 显然,删除“NOT”会产生相反的影响。

SELECT DISTINCT `u`.* 
FROM (`system_users` AS u) 
INNER JOIN `system_user_permissions` AS p 
   ON `u`.`id` = `p`.`user` 
WHERE `p`.`permission` not in (2,3)

你试过这个吗? 我认为你的问题是()

SELECT DISTINCT u 。* FROM( system_users AS u)JOIN system_user_permissions AS p ON u id = p userppermission != 2和ppermission != 3)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM