2013-10-15 4 views
0

je tables des utilisateurs, des groupes et users_groups mis en place comme suit:requête SQL pour filtrer un grand nombre à plusieurs

users 
    id int 

groups 
    id int 

users_groups 
    user_id int 
    group_id int 

Exemple de données

+-------+--------+ 
|user_id|group_id| 
+-------+--------+ 
| 1 | 1 | 
| 1 | 2 | 
| 1 | 3 | 
| 2 | 1 | 
| 2 | 2 | 
| 3 | 2 | 
| 3 | 3 | 
+-------+--------+ 

Est-il possible de sélectionner tous les utilisateurs appartenir à un sous-ensemble de groupes qui a une taille inconnue? Ceci est essentiellement un filtrage basé sur les identifiants de groupe. Par exemple, une requête renvoyant des identifiants d'utilisateur pour les membres des groupes 1 et 2 renvoie un identifiant d'utilisateur de [1,2], mais lorsqu'on lui demande des membres des groupes 1,2 et 3, il renvoie un identifiant d'utilisateur de [ 1]

Répondre

1

Si vous ne souhaitez que les utilisateurs étant dans tous les groupes utilisent 3

select user_id 
from users_groups ug 
where group_id in (1,2,3) 
group by user_id 
having count(distinct group_id) = 3 
+0

+1 pour cela, que je suis en train de créer démo violon avec la fonction, donc répondu après toi :) –

1

vous pouvez le faire essentiellement en regroupant et en comptant le nombre d'entrées. Vous pouvez le faire par une simple requête, comme juergen_d a fait, ou utilisez la fonction comme ceci:

create function fn_users_groups(_groups int[]) 
returns table(user_id int) 
as 
$$ 
    select user_id 
    from users_groups 
    where group_id = any(_groups) 
    group by user_id 
    having count(*) = array_length(_groups, 1) 
$$ 
language sql; 

=> sql fiddle demo

Questions connexes