| userColumn | permissionColumn |
|---|---|
| user1 | permission1 |
| user1 | permission2 |
| user2 | permission1 |
| user3 | permission1 |
| user3 | permission3 |
| user4 | permission1 |
As cited in the subject line, I need to fetch all those users who have permissions 'permission1' but at the same time, I have to make sure that it doesn’t have the other permissions like 'permission2' and 'permission3'.
How can I achieve this with MySQL? Will it work with just a single query or do we need an inner join or nested query?
Desired Result:
| userColumn |
|---|
| user2 |
| user4 |
Advertisement
Answer
SELECT user FROM table GROUP BY user HAVING NOT SUM(permission <> 'permission1');
permission <> 'permission1' returns 0 for ‘permission1’ and 1 otherwise.
SUM() by fact counts the amount of non-'permission1' values. We need the rows where there is no 'permission1', i.e. where this sum is zero.
NOT inverts SUM() result – i.e. converts zero to 1 and non-zero to 0. As a result we obtain only needed rows.
The query assumes that permission column cannot be NULL.