Pour obtenir seulement 13 et 15, procédez comme suit :
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
Cela vérifie que 13 et 15 sont dans l'ensemble user_id. Il vérifie ensuite que rien d'autre ne se trouve dans l'ensemble.
Je me rends compte que l'utilisation de la clause having avec l'instruction case semble gênante au début. Cependant, vous pouvez exprimer beaucoup de logique sur différentes combinaisons de choses dans l'ensemble.