Ниже приведен пример схемы, с которой я работаю.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)
Похоже, что у вас есть мошенник) в вашем месте где. Кроме того, у вас есть контроль над схемой? –
У меня нет контроля. Исправлен посторонний пар, который был опечаткой в моем первоначальном представлении. – Josh