пользовательКолонка | разрешениеКолонка |
---|---|
пользователь1 | разрешение1 |
пользователь1 | разрешение2 |
пользователь2 | разрешение1 |
пользователь3 | разрешение1 |
пользователь3 | разрешение3 |
пользователь4 | разрешение1 |
Как указано в строке темы, мне нужно получить всех тех пользователей, у которых есть разрешения 'permission1'
, но в то же время я должен убедиться, что у них нет других разрешений, таких как 'permission2'
и 'permission3'
.
Как я могу добиться этого с помощью MySQL? Будет ли он работать только с одним запросом или нам нужно внутреннее соединение или вложенный запрос?
Желаемый результат:
пользовательКолонка |
---|
пользователь2 |
пользователь4 |
SELECT user
FROM table
GROUP BY user
HAVING NOT SUM(permission <> 'permission1');
permission <> 'permission1'
возвращает 0 для «permission1» и 1 в противном случае.
SUM() фактически подсчитывает количество значений, отличных от 'permission1'
. Нам нужны строки, где нет 'permission1'
, т.е. где эта сумма равна нулю.
НЕ инвертирует результат SUM() - т.е. преобразует ноль в 1 и ненулевое значение в 0. В результате мы получаем только нужные строки.
Запрос предполагает, что столбец permission
не может быть NULL.
Одним из вариантов может быть использование условной агрегации при группировке по user
, чтобы проверить, равно ли количество разрешений значений permission1
количеству всех строк для каждого пользователя, например
SELECT user
FROM UserPermissions
GROUP BY user
HAVING COUNT(*) = SUM(CASE WHEN permission = 'permission1' THEN 1 END)