Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
je dispose d'un table liant utilisateurs et des groupes
je cherche a executer une requète qui va trouver tous les user_id qui n'ont aucune relation avec le groupe 1 ou le groupe 2
J'ai beau me casser la tête mais sans succès, merçi d'avance de votre aide.
Dans l'example ci dessous , je ne devrais retrouver que le user_id = 3
user_id group_id
1 1
1 2
1 7
2 2
2 9
3 7
4 1
voilà :)
Hors ligne
SELECT * FROM ma_table WHERE group_id NOT IN (1,2)
Mais cette question a plus sa place sur un forum SQL général. Ou encore mieux, commencez par suivre un tutoriel (il y en a plein sur internet). Si vous vous posez ce genre de question, c'est que vous débutez.
Marc.
Hors ligne
merçi de ta réponse (fort peu charmante soit dit en passant)
mais c'est n'est pas ce que je recherche si tu veux relire l'énoncé !!
Hors ligne
quelque chose comme :
select distinct A.user_id FROM matable A WHERE NOT EXISTS ( SELECT 1 FROM matable B WHERE A.user_id = B.user_id AND B.goup_id IN (1,2))
ça devrait le faire.
Hors ligne
Ah oui, effectivement, regardé trop rapidement, la question n'est pas triviale (ne le prends pas mal, on a beaucoup de questions très simples…)
Il y a la solution précédente, qui a le défaut de faire une boucle imbriquée (pas de problème sur 7 enregistrements).
SELECT user_id from test group by user_id having not 1=any(array_agg(group_id)) and not 2=any(array_agg(group_id));
Celle-ci a l'avantage de ne faire qu'une seule passe sur la table, si le volume de données est très grand. Mais elle est plus complexe.
Marc.
Hors ligne
Merçi à vous deux
Hors ligne
SELECT user_id from test group by user_id having not 1=any(array_agg(group_id)) and not 2=any(array_agg(group_id));
Bonjour Marc,
est-il possible d'avoir une petite explicaction sur la notation having not 1=any(array_agg(group_id)) and not 2=any(array_agg(group_id)); ?
je découvre array_agg, mais le reste est un peu abscon pour moi.
Cordialement
Hors ligne
oui, bien sûr.
- on regroupe sur user_id
- on aggrège group_id dans un tableau (array_agg)
- on vérifie que dans ce tableau il n'y a pas 1 (not 1=any(array_agg(group_id)) ni 2.
ANY itère sur les éléments du tableau pour les comparer à la valeur avant any
Dernière modification par Marc Cousin (20/12/2010 17:41:22)
Marc.
Hors ligne
Comme quoi, j'ai bien fait de demander!
Je n'avais pas du tout percuté que ton "1" et "2" devant les "any(array_agg..." était en fait les groupe 1 et 2.
Je pensais que c'était une notation (un peu comme quand on fait un order by 1,2 pour dire d'ordonner sur les deux premières colonnes).
Cette notation inversé est en fait un peu déroutante. On a pas l'habitude de voire la valeur comme premier argument de la condition.
Merci beaucoup
Hors ligne
Pages : 1