2015-07-10 109 views
0

下面是我与工作模式的一个例子。SQL查询JOIN,WHERE,GROUPBY,COUNT

如何返回所有拥有权限的用户的idname,但是没有相应的权限认证?

例如,查询将返回0,约翰在这种情况下,由于约翰的“删除”权限,但是不具有匹配的“删除”认证。

(该模式是任意的,做作的,我只是想在语法/选择逻辑来获取此查询)

users 
===== 
id name 
-------- 
0 john 
1 joe 

user_permissions 
================ 
uid permission 
-------------- 
0 'edit' 
0 'delete' 
1 'edit 

user_certs 
========== 
uid cid 
------- 
0 'edit' 
1 'edit' 

我试过,这一点,我知道最后一行错误。

SELECT DISTINCT id, name FROM users 
LEFT JOIN user_permissions users ON users.uid = user_permissions.uid 
LEFT JOIN user_certs ON users.id = user_certs.uid 
WHERE (user.permission = 'delete') 
GROUP BY id, name 
HAVING (COUNT(user_certs.cid = 'delete') = 0) 
+0

看起来您在WHERE子句中有一个流氓)。另外,您是否可以控制架构? –

+0

我没有控制权。修正了多余的paren,这是我在最初提交时的拼写错误。 – Josh

回答

2

获取不具有匹配的证书,然后组上的用户的所有权限:

select 
    u.id, 
    u.name 
from 
    users u 
    inner join user_permissions p on p.uid = u.id 
    left join user_certs c on c.uid = p.uid and c.cid = p.permission 
where 
    c.uid is null 
group by 
    u.id, 
    u.name 
+0

谢谢你,我的例子很糟糕,但这让我足够接近看着办吧:) – Josh

0

老兄,你是对的。

的别名用户模具不存在。

+0

对不起,只是一个错字在我的例子。 – Josh