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

时间:2011-12-30 16:46:41

标签: php mysql join

尝试使用单个查询执行此操作,但希望获取有权执行x的所有用户的列表。这涉及users表和权限表。但看起来我使用的任何连接都不关心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)
)

4 个答案:

答案 0 :(得分:3)

您想要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(这是您想要的)的用户。只要在not exists中为该用户找到权限2或3,system_user_permissions就会将该用户撤出。

答案 1 :(得分:1)

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

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);

答案 2 :(得分:0)

使用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)

答案 3 :(得分:-1)

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

SELECT DISTINCT u。* FROM(system_users AS u) 加入system_user_permissions AS uid = puser WHERE(ppermission!= 2 AND ppermission!= 3)