Все значения из первого столбца соответствуют значениям во втором столбце, а также не соответствуют значениям из второго столбца

пользовательКолонкаразрешениеКолонка
пользователь1разрешение1
пользователь1разрешение2
пользователь2разрешение1
пользователь3разрешение1
пользователь3разрешение3
пользователь4разрешение1

Как указано в строке темы, мне нужно получить всех тех пользователей, у которых есть разрешения 'permission1', но в то же время я должен убедиться, что у них нет других разрешений, таких как 'permission2' и 'permission3'.

Как я могу добиться этого с помощью MySQL? Будет ли он работать только с одним запросом или нам нужно внутреннее соединение или вложенный запрос?

Желаемый результат:

пользовательКолонка
пользователь2
пользователь4
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
27
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
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)

Demo

Другие вопросы по теме