2015-07-10 132 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