Я только что видел такой вопрос на днях. Я думаю, что самая сложная часть здесь - вы ищете комбинации user_id / profile_id, где user_id имеет каждый group_id, который есть в profile_id, не больше и не меньше. Поэтому возьмите обычное объединение и добавьте некоторую корреляцию, чтобы подсчитать количество group_ids каждого профиля / пользователя и убедитесь, что они совпадают (это было отредактировано несколько раз):
select user_id, profile_id
from user_groups join profile_groups on
user_groups.group_id=profile_groups.group_id
group by user_id, profile_id
having count(user_groups.group_id) =
(select count(*) from profile_groups as pg where
pg.profile_id=profile_groups.profile_id)
and count(profile_groups.group_id) = (select count(*) from user_groups as ug where
ug.user_id=user_groups.user_id)
;
Вот прогон, который включает два профиля с тремя группами в каждом, с одной общей группой между ними и новым пользователем в четвертом профиле:
sqlite> create table user_groups (user_id integer, group_id varchar);
sqlite> create table profile_groups (profile_id integer, group_id varchar);
sqlite> insert into user_groups values(1, 'group1');
sqlite> insert into user_groups values(1, 'group2');
sqlite> insert into user_groups values(1, 'group3');
sqlite> insert into user_groups values(2, 'group1');
sqlite> insert into user_groups values(2, 'group2');
sqlite> insert into user_groups values(3, 'group4');
sqlite> insert into user_groups values(4, 'group1');
sqlite> insert into user_groups values(4, 'group5');
sqlite> insert into user_groups values(4, 'group6');
sqlite>
sqlite> insert into profile_groups values (11, 'group1');
sqlite> insert into profile_groups values (11, 'group2');
sqlite> insert into profile_groups values (11, 'group3');
sqlite>
sqlite> insert into profile_groups values (21, 'group1');
sqlite> insert into profile_groups values (21, 'group2');
sqlite>
sqlite> insert into profile_groups values (22, 'group4');
sqlite>
sqlite> insert into profile_groups values (23, 'group1');
sqlite> insert into profile_groups values (23, 'group5');
sqlite> insert into profile_groups values (23, 'group6');
sqlite> select user_id, profile_id
...> from user_groups join profile_groups on
...> user_groups.group_id=profile_groups.group_id
...> group by user_id, profile_id
...> having count(user_groups.group_id) =
...> (select count(*) from profile_groups as pg where
...> pg.profile_id=profile_groups.profile_id)
...> and count(profile_groups.group_id) = (select count(*) from user_groups as ug where
...> ug.user_id=user_groups.user_id)
...> ;
1|11
2|21
3|22
4|23