fields be of these types:
srcT.idF = "pk" [ implicit field ] srcT.srcF = "string" srcT.enum1IdF = "enum.enumT" srcT.enum2IdF = "enum.enumT" srcT.list1F = "list.listdstT.back1IdF" srcT.list2F = "list.listdstT.back2IdF" srcT.set1F = "set.link1T" srcT.set2F = "set.link2T" enumT.idF = "pk" [ implicit field ] enumT.enF = "string" listdstT.idF = "pk" [ implicit field ] listdstT.back1IdF = "enum.srcT" listdstT.back2IdF = "enum.srcT" listdstT.lsF = "string" link1T.srcIdF = "enum.srcT" link1T.dstIdF = "enum.dstT" link2T.srcIdF = "enum.srcT" link2T.dstIdF = "enum.dstT" dstT.idF = "pk" [ implicit field ] dstT.setF = "string"not yet sure how to call the 'enum' field. enum sort of implies a short limited number of values, while actually this may also be something like a userid. maybe I should call it reference. or just plain 'foreigh key' / 'fk'.
several combinations are possible:
where srcF='src1'
left join listDstT j1 on j1.back1IdF=j0.idF and j1.lsF='list1' where not j1.back1IdF is NULL
left join enumT j1 on j1.idF=j0.enum1IdF and j1.enF='group1' where not j1.idF is NULL
left join enumT j1 on j1.idF=j0.enum1IdF and j1.enF='group1' where j1.idF is NULL
left join (link1T j1 join dstT j2 on j1.dstIdF=j2.idF and j2.setF='set1') on j1.srcIdF=j0.idF where not j1.srcIdF is NULL
left join (link1T j1 join dstT j2 on j1.dstIdF=j2.idF and j2.setF in (list) ) on j1.srcIdF=j0.idF left join (link1T j3 joie dstT j4 on j3.dstIdF=j4.idF and j4.setF in (list) ) on j3.srcIdF=j0.idF where not j1.srcIdf is null and j3.srcIdF is null group by j0.IdF having count(*) = sizeof(list)
left join (group1T j1 join (group2T j2 join (group3T j3) on j3.idF=j2.enum3IdF and and j3.enF='val') on j2.idF=j1.enum2IdF) on j1.idF=j0.enum1IdF where not j1.idF is NULL
table user username string groups set.usergroup.group table group groupname string users set.usergroup.user [implicit table 'usergroup']
select j0.id from user j0 left join ( select j0.userid from usergroup_set j0 left join group j1 on j0.groupid=j1.id and j1.groupname in ('Guests') left join group j2 on j0.groupid=j2.id and not j2.groupname in ('Guests') where not j1.id is null and j2.id is null group by j0.userid having count(*)=1 ) j1 on j0.id=j1.userid left join ( select j0.userid from usergroup_set j0 left join group j1 on j0.groupid=j1.id and j1.groupname in ('Admins') left join group j2 on j0.groupid=j2.id and not j2.groupname in ('Admins') where not j1.id is null and j2.id is null group by j0.userid having count(*)=1 ) j2 on j0.id=j2.userid where not j1.userid is null or not j2.userid is null