Om alleen . te krijgen 13 en 15, doe dan het volgende:
select user_id
from my_table
group by user_id
having max(case when role_id = 13 then 1 else 0 end) = 1 and -- has 13
max(case when role_id = 15 then 1 else 0 end) = 1 and -- has 15
max(case when role_id not in (13, 15) then 1 else 0 end) = 0 -- nothing else
Hiermee wordt gecontroleerd of 13 en 15 in de set user_id staan. Het controleert dan of er niets anders in de set zit.
Ik realiseer me dat het gebruik van de hebbende clausule met de case-statement in eerste instantie onhandig lijkt. Je kunt echter veel logica uitdrukken over verschillende combinaties van dingen in de set.