Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

jointure 3 tables avec clause where

5 réponses
Avatar
Antonio Fontes
Bonjour à tous,

Dans le cadre d'une gestion de droits et de permissions sur une application web,
je cherche à afficher une liste d'utilisateurs membres ou non membres d'un groupe.

L'objectif étant de pouvoir sélectionner un groupe, puis d'avoir une liste de tous les
utilisateurs d'un 'domaine virtuel' , avec une case cochée ou non selon s'ils sont membres
ou pas du groupe sélectionné:

----------exemple d'interface--------------

vous avez sélectionné le groupe: 'éditeurs':

- alain: [x]
- sylvie: [x]
- sophie: [ ]
- marc: [ ]
------------------------------------------------------

Au niveau de mes tables, j'ai ceci:

users_usr
-------------------------------
PK usr_id
usr_domain_ref
usr_login
-------------------------------

groups_grp
-------------------------------
PK grp_id
grp_domain_ref
grp_name
-------------------------------

memberships_mbr
-------------------------------
FK mbr_group_ref
FK mbr_user_ref
-------------------------------

Actuellement voici ce que j'arrive à faire:

- obtenir un jeu d'enregistrements avec tous les utilsateurs, et le groupe associé.
- si le groupe est null (donc l'utilisateur n'est membre d'aucun groupe), la valeur 'null' est remplacée par 0
pour mes tests
- je peux spécifier le 'domaine' de l'utilisateur.

Et voici ce que je cherche à faire en plus:

- obtenir les mêmes résultats mais uniquement pour UN groupe spécifique.

Et voici ce qui insouhaitable:

- les utilisateurs membres d'aucun domaine ne sont plus affichés.


La requête avant:
----------------------------------------------------------
SELECT usr_login, ISNULL(grp_id,0) AS grp_id
FROM memberships_mbr
RIGHT OUTER JOIN groups_grp
ON mbr_group_ref = grp_id
RIGHT OUTER JOIN users_usr
ON mbr_user_ref = usr_id
WHERE usr_domain_ref = 4
----------------------------------------------------------


La requête avec la nouvelle clause, mais qui me fait disparaître les utilisateurs
membres d'aucun groupe:
----------------------------------------------------------
SELECT usr_login, ISNULL(grp_id,0) AS grp_id
FROM memberships_mbr
RIGHT OUTER JOIN groups_grp
ON mbr_group_ref = grp_id
RIGHT OUTER JOIN users_usr
ON mbr_user_ref = usr_id
WHERE usr_domain_ref = 4
AND grp_id = 5
----------------------------------------------------------

Quelqu'un aurait-il une idée sur le petit détail sur lequel je me trompe ? = )

.antoine

5 réponses

Avatar
Patrice
grp_id=5 OR grp_id IS NULL ?

(pour avoir le groupe que tu veux mais garder la ligne de l'utilisateur même
si il n'est pas membre de ce groupe ?)

Sinon dans la logique s'agissant d'une liste d'utilisateur il est peut-être
plus facile de raisonner en partant de la table d'utilisateur et en faisant
un outer join sur le groupe 5...

Patrice

--

"Antonio Fontes" a écrit dans le message
de news:


Bonjour à tous,

Dans le cadre d'une gestion de droits et de permissions sur une


application web,
je cherche à afficher une liste d'utilisateurs membres ou non membres d'un


groupe.

L'objectif étant de pouvoir sélectionner un groupe, puis d'avoir une liste


de tous les
utilisateurs d'un 'domaine virtuel' , avec une case cochée ou non selon


s'ils sont membres
ou pas du groupe sélectionné:

----------exemple d'interface--------------

vous avez sélectionné le groupe: 'éditeurs':

- alain: [x]
- sylvie: [x]
- sophie: [ ]
- marc: [ ]
------------------------------------------------------

Au niveau de mes tables, j'ai ceci:

users_usr
-------------------------------
PK usr_id
usr_domain_ref
usr_login
-------------------------------

groups_grp
-------------------------------
PK grp_id
grp_domain_ref
grp_name
-------------------------------

memberships_mbr
-------------------------------
FK mbr_group_ref
FK mbr_user_ref
-------------------------------

Actuellement voici ce que j'arrive à faire:

- obtenir un jeu d'enregistrements avec tous les utilsateurs, et le


groupe associé.
- si le groupe est null (donc l'utilisateur n'est membre d'aucun


groupe), la valeur 'null' est remplacée par 0
pour mes tests
- je peux spécifier le 'domaine' de l'utilisateur.

Et voici ce que je cherche à faire en plus:

- obtenir les mêmes résultats mais uniquement pour UN groupe


spécifique.

Et voici ce qui insouhaitable:

- les utilisateurs membres d'aucun domaine ne sont plus affichés.


La requête avant:
----------------------------------------------------------
SELECT usr_login, ISNULL(grp_id,0) AS grp_id
FROM memberships_mbr
RIGHT OUTER JOIN groups_grp
ON mbr_group_ref = grp_id
RIGHT OUTER JOIN users_usr
ON mbr_user_ref = usr_id
WHERE usr_domain_ref = 4
----------------------------------------------------------


La requête avec la nouvelle clause, mais qui me fait disparaître les


utilisateurs
membres d'aucun groupe:
----------------------------------------------------------
SELECT usr_login, ISNULL(grp_id,0) AS grp_id
FROM memberships_mbr
RIGHT OUTER JOIN groups_grp
ON mbr_group_ref = grp_id
RIGHT OUTER JOIN users_usr
ON mbr_user_ref = usr_id
WHERE usr_domain_ref = 4
AND grp_id = 5
----------------------------------------------------------

Quelqu'un aurait-il une idée sur le petit détail sur lequel je me trompe ?


= )

.antoine





Avatar
Antonio Fontes
> grp_id=5 OR grp_id IS NULL ?


Non. La clause restrictive ne peut avoir lieu vu que avant la requête
il n'y a pas de champs nuls. Ce n'est pas sur le where que cela va
marcher .. Par contre, cela m'a fait réaliser que je pouvais effectuer le
traitement non pas sur la restriction mais sur le formatage des résultats.

J'ai donc ceci: j'évite de faire la restriction sur la clause
WHERE mais j'effectue un traitement sur les résultats retournés. Par contre
ce n'est pas 'propre' vu que l'information sur les autres ID de groupes est
tout de même 'traitée' à un instant par le serveur:

----tous les utilisateurs membres et non membres du groupe '4', ----------------
----membres du domaine numéro 5--------------------------------------------
----avec '0' si l'utilisateur n'est pas membre du groupe--------------------------

SELECT usr_login, grp_id = CASE WHEN grp_id <> 4 THEN 0 WHEN grp_id IS NULL THEN 0 ELSE grp_id END
FROM acl_groupmembers_grpmbr
RIGHT OUTER JOIN acl_groups_grp
ON grpmbr_group_ref = grp_id
RIGHT OUTER JOIN dbo.acl_users_usr
ON grpmbr_user_ref = usr_id
WHERE usr_domaine_ref = 5
------------------------------------------------------------------------------

Et là j'obtiens bien le jeu de résultats souhaité:

usr_id grp_id
---------------------
alain 4
sylvie 4
sophie 0
marc 0
...

Bref, j'ai une solution mais il ne me semble pas que ce soit la plus propre. Si jamais
quelqu'un a mieux (ce n'est plus du tout urgent pour l'instant) je reste ouvert à toute
proposition ; )

.antoine
Avatar
Patrice
Le WHERE est fait après la jointure qui te ramène des NULLs si pas de
correspondance. Après pour être tout a tout à fait franc, je n'ai peut-être
pas compris le point exact qui posait problème dans le message original
(j'ai cru comprendre que cela allait bien en faisant la requête sur tous les
groupes mais que cela n'allait pas en sélectionnant un groupe précis (il
manque des lignes ?))

Si je reprends la logique dans ce cas tu peux pêut-être faire quelque chose
comme :
- prendre le groupe 5
- joindre avec tous les utilisateurs existants
- outer join des membres sur le couple (groupe,utilisateur)

Ce dernier outer join remènera effectivement une donnée si le couple existe
(membre) et NULL si le couple n'existe pas (non membre).

Ce qui devrait donner quelque chose comme (sans reprendre tes conventions) :

SELECT *,CASE WHEN Membres.Membre IS NULL THEN 0 ELSE 1 END AS EstMembre
FROM Groupes
-- Tous les couples (groupe,utilisateur)
CROSS JOIN Utilisateurs
LEFT JOIN Membres ON Membres.Groupe=Groupes.Groupe AND
Utilisateurs.Utilisateur=Utilisateurs.Utilisateurs
-- Pour le groupe 5
WHERE Groupe=5

Patrice

--

"Antonio Fontes" a écrit dans le message
de news:

> grp_id=5 OR grp_id IS NULL ?
Non. La clause restrictive ne peut avoir lieu vu que avant la requête
il n'y a pas de champs nuls. Ce n'est pas sur le where que cela va
marcher .. Par contre, cela m'a fait réaliser que je pouvais effectuer le
traitement non pas sur la restriction mais sur le formatage des résultats.

J'ai donc ceci: j'évite de faire la restriction sur la clause
WHERE mais j'effectue un traitement sur les résultats retournés. Par


contre
ce n'est pas 'propre' vu que l'information sur les autres ID de groupes


est
tout de même 'traitée' à un instant par le serveur:

----tous les utilisateurs membres et non membres du groupe


'4', ----------------
----membres du domaine numéro


5--------------------------------------------
----avec '0' si l'utilisateur n'est pas membre du


groupe--------------------------

SELECT usr_login, grp_id = CASE WHEN grp_id <> 4 THEN 0 WHEN grp_id IS


NULL THEN 0 ELSE grp_id END
FROM acl_groupmembers_grpmbr
RIGHT OUTER JOIN acl_groups_grp
ON grpmbr_group_ref = grp_id
RIGHT OUTER JOIN dbo.acl_users_usr
ON grpmbr_user_ref = usr_id
WHERE usr_domaine_ref = 5
--------------------------------------------------------------------------


----

Et là j'obtiens bien le jeu de résultats souhaité:

usr_id grp_id
---------------------
alain 4
sylvie 4
sophie 0
marc 0
...

Bref, j'ai une solution mais il ne me semble pas que ce soit la plus


propre. Si jamais
quelqu'un a mieux (ce n'est plus du tout urgent pour l'instant) je reste


ouvert à toute
proposition ; )

.antoine





Avatar
Fred BROUARD
SELECT usr_login, COALESCE(grp_id, 0) AS grp_id
FROM memberships_mbr m
LEFT OUTER JOIN groups_grp g
ON m.mbr_group_ref = p.grp_id
LEFT OUTER JOIN users_usr u
ON m.mbr_user_ref = u.usr_id
WHERE u.usr_domain_ref = 4 OR u.usr_domain_ref IS NULL

ou encore :

SELECT usr_login, COALESCE(grp_id, 0) AS grp_id
FROM memberships_mbr m
LEFT OUTER JOIN groups_grp g
ON m.mbr_group_ref = p.grp_id
LEFT OUTER JOIN users_usr u
ON m.mbr_user_ref = u.usr_id AND u.usr_domain_ref = 4


A +


--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************

Antonio Fontes a écrit:
Bonjour à tous,

Dans le cadre d'une gestion de droits et de permissions sur une application web,
je cherche à afficher une liste d'utilisateurs membres ou non membres d'un groupe.

L'objectif étant de pouvoir sélectionner un groupe, puis d'avoir une liste de tous les
utilisateurs d'un 'domaine virtuel' , avec une case cochée ou non selon s'ils sont membres
ou pas du groupe sélectionné:

----------exemple d'interface--------------

vous avez sélectionné le groupe: 'éditeurs':

- alain: [x]
- sylvie: [x]
- sophie: [ ]
- marc: [ ]
------------------------------------------------------

Au niveau de mes tables, j'ai ceci:

users_usr
-------------------------------
PK usr_id
usr_domain_ref
usr_login
-------------------------------

groups_grp
-------------------------------
PK grp_id
grp_domain_ref
grp_name
-------------------------------

memberships_mbr
-------------------------------
FK mbr_group_ref
FK mbr_user_ref
-------------------------------

Actuellement voici ce que j'arrive à faire:

- obtenir un jeu d'enregistrements avec tous les utilsateurs, et le groupe associé.
- si le groupe est null (donc l'utilisateur n'est membre d'aucun groupe), la valeur 'null' est remplacée par 0
pour mes tests
- je peux spécifier le 'domaine' de l'utilisateur.

Et voici ce que je cherche à faire en plus:

- obtenir les mêmes résultats mais uniquement pour UN groupe spécifique.

Et voici ce qui insouhaitable:

- les utilisateurs membres d'aucun domaine ne sont plus affichés.


La requête avant:
----------------------------------------------------------
SELECT usr_login, ISNULL(grp_id,0) AS grp_id
FROM memberships_mbr
RIGHT OUTER JOIN groups_grp
ON mbr_group_ref = grp_id
RIGHT OUTER JOIN users_usr
ON mbr_user_ref = usr_id
WHERE usr_domain_ref = 4
----------------------------------------------------------


La requête avec la nouvelle clause, mais qui me fait disparaître les utilisateurs
membres d'aucun groupe:
----------------------------------------------------------
SELECT usr_login, ISNULL(grp_id,0) AS grp_id
FROM memberships_mbr
RIGHT OUTER JOIN groups_grp
ON mbr_group_ref = grp_id
RIGHT OUTER JOIN users_usr
ON mbr_user_ref = usr_id
WHERE usr_domain_ref = 4
AND grp_id = 5
----------------------------------------------------------

Quelqu'un aurait-il une idée sur le petit détail sur lequel je me trompe ? = )

.antoine





Avatar
Antoine F.
Ok merci, je vais regarder cela dès que je peux, mais pas de réponse dans
la journée sûrement vu ce que l'on vient de me demander de faire = )

,antoine


"Fred BROUARD" wrote in message news:
SELECT usr_login, COALESCE(grp_id, 0) AS grp_id
FROM memberships_mbr m
LEFT OUTER JOIN groups_grp g
ON m.mbr_group_ref = p.grp_id
LEFT OUTER JOIN users_usr u
ON m.mbr_user_ref = u.usr_id
WHERE u.usr_domain_ref = 4 OR u.usr_domain_ref IS NULL

ou encore :

SELECT usr_login, COALESCE(grp_id, 0) AS grp_id
FROM memberships_mbr m
LEFT OUTER JOIN groups_grp g
ON m.mbr_group_ref = p.grp_id
LEFT OUTER JOIN users_usr u
ON m.mbr_user_ref = u.usr_id AND u.usr_domain_ref = 4


A +