PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#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

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 smile

Hors ligne

#7 20/12/2010 15:59:53

meles
Membre

Re : aide sur requète sql

Marc Cousin a écrit :

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

Pied de page des forums