尝试使用单个查询执行此操作,但希望获取有权执行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)
)
答案 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 u
。id
= p
。user
WHERE(p
。permission
!= 2 AND p
。permission
!= 3)