Вы пытаетесь создать таблицу всех пользователей и групп?
Если нет, если вы просто хотите узнать, в каких группах находится пользователь или какие пользователи в группе, приведенный выше подход будет очень медленным, чтобы получить запрос.
Да, и возникает вопрос, нужно ли все это делать одним запросом, или вы можете смешать какой-то код приложения.
Чтобы найти всех пользователей в группе, моей первой мыслью было бы, чтобы приложение сначала прочитало запись группы и проверило режим объединения. Затем, если режим соединения «in», выполните обычный запрос:
select userName
from userGroup ug
join user u using (userId)
where ug.groupId=?
Если режим соединения «ex», запустите:
select userName
from user u
where not exists (select * from userGroup ug where ug.groupId=? and ug.userId=u.userId)
Если по какой-то причине это нужно сделать одним запросом, возможно:
select userName
from group g
left join user u on joinMode='in'
and exists (select * from userGroup ug where ug.groupid=g.groupid and ug.userid=u.userid)
or joinMode='ex'
and not exists (select * from userGroup ug where ug.groupid=g.groupid and ug.userid=u.userid)
where g.groupid=?
Это работает, но, честно говоря, я не уверен, на что будет похожа производительность. Я разработал план объяснения в MySQL, и он решил прочитать всю таблицу User, но тогда у меня было только три записи, может быть, с большим количеством записей он мог бы составить другой план.