Вот один из методов:
with ug as (
SELECT u.username, g.name
FROM Users u JOIN
Permissions p
ON u.id = p.user_id
)
SELECT DISTINCT ug.username
FROM ug
WHERE EXISTS (SELECT 1
FROM ug ug2
WHERE ug2.group_id = ug.group_id AND
ug2.username = 'Ryan'
);
Вышеуказанное имя группы присваивается каждому пользователю, а затем обрабатывается как одна таблица. EXISTS
используется, чтобы определить, перекрываются ли группы.
Обратите внимание, что groups
не требуется, поскольку вы не запрашиваете название группы. Идентификатора достаточно, чтобы ответить на вопрос.
Я не большой поклонник использования select distinct
. Обычно это означает, что ядро базы данных выполняет больше работы, чем необходимо - создает дубликаты , а затем их удаляет.
Вот альтернативное решение, использующее exists
:
select u.*
from users u
where exists (select 1
from permissions p join
permissions pr
on pr.group_id = p.group_id join
users ur
on pr.user_id = ur.user_id and
ur.username = 'Ryan'
where p.user_id = u.id
);