Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 15/12/2010 11:06:33
- dlamotte21
- Membre
aide sur requète sql
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
#2 15/12/2010 11:24:31
- Marc Cousin
- Membre
Re : aide sur requète sql
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
#3 15/12/2010 11:29:05
- dlamotte21
- Membre
Re : aide sur requète sql
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
#4 15/12/2010 11:30:30
- herve.lefebvre
- Membre
Re : aide sur requète sql
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
#5 15/12/2010 18:33:05
- Marc Cousin
- Membre
Re : aide sur requète sql
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
#6 16/12/2010 14:32:15
- dlamotte21
- Membre
Re : aide sur requète sql
Merçi à vous deux
Hors ligne
#7 20/12/2010 15:59:53
- meles
- Membre
Re : aide sur requète sql
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
#8 20/12/2010 17:41:11
- Marc Cousin
- Membre
Re : aide sur requète sql
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
#9 20/12/2010 17:47:58
- meles
- Membre
Re : aide sur requète sql
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