2011-12-30 74 views
1

尝试使用单个查询执行此操作,但希望获取有权执行x操作的所有用户的列表。这涉及用户表和权限表。但它看起来像任何联接我用不关心有关where语句(因为用户通常必须在表中的另一个许可)Mysql加入,检查用户是否有权限

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个用户谁不依赖要么许可身份证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

从查询中写出你想要的输出 – AlfredoVR 2011-12-30 16:48:01

+0

我只需要用户列表。只需加入即可使用功能 – kilrizzy 2011-12-30 16:51:37

+0

为我们提供示例输出。与表格结构一样,如果表格不太大。 – 2011-12-30 17:16:36

回答

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

所有原始查询正在做的是否定有任何用户外核层y权限2或3,而不是1,2和5(这是你想要的)。一旦在该用户的system_user_permissions中发现权限2或3,则一个not exists将会丢弃该用户。

+0

亿万谢谢你! – kilrizzy 2011-12-30 17:20:45

+1

不客气!值得一提的是,存在'也存在,它的作用与'not exists'相反,所以如果你想抓取所有拥有2或3权限的用户,你只需要拿出'not',瞧,你说对了。 – Eric 2011-12-30 17:26:21

+0

我的解决方案有相同的方法,但这个更可读性:) – 2011-12-30 18:10:06

0

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

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) 
+0

真的很兴奋尝试这个,以前没有用过,但仍然没有运气。仍然收到3900作为我的计数。如果我选择并输出权限ID并列出,我没有得到输出的数字,但它只是显示用户具有的不同权限ID – kilrizzy 2011-12-30 17:03:24

+0

您需要为我们提供表格的示例数据。我不完全确定你的意思是通过获得不同的权限ID。 – 2011-12-30 17:15:43

+0

@MattMoore - kilrizzy意味着他获得的权限为1或5或任何其他行,但该用户仍具有2或3的权限记录,因此用户应被取消对结果集的资格。您的查询不会取消这些用户的资格,只会以* 2 *或3权限取消用户的资格。 – Eric 2011-12-30 17:19:40

-1

你试过吗?我觉得你的问题是()

SELECT DISTINCT u。* FROM (system_users为u) JOIN system_user_permissions为P ON uid = puser WHERE

1

你可能接近相反的方式,specifiying哪些用户不应该出现在列表中,这样的(ppermission = 2,ppermission = 3。!。!):

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); 
相关问题