2015-07-10 6 views
0

Ниже приведен пример схемы, с которой я работаю.SQL-запрос с JOIN, WHERE, GROUPBY, COUNT

Как я могу вернуть id и name всех пользователей, у которых есть разрешение, но у вас нет соответствующей сертификации для этого разрешения?

Например, запрос будет возвращать 0, john в этом случае, поскольку john имеет разрешение «удалить», но не имеет соответствующей сертификации «удалить».

(Эта схема является произвольным и надуманным, я просто пытаюсь получить в синтаксисе/выбора логики для этого запроса)

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

Похоже, что у вас есть мошенник) в вашем месте где. Кроме того, у вас есть контроль над схемой? –

+0

У меня нет контроля. Исправлен посторонний пар, который был опечаткой в ​​моем первоначальном представлении. – 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

Bud вы правы.

Псевдоним пользователя не существует.

+0

Извините, просто опечатка в моем примере. – Josh