PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Sélection d'un sous-ensemble correspondant dans une relation plusieurs à plusieurs

Select project_ID 
from user_projects
where user_ID in (1,2)
group by project_ID
Having count(*) = 2

Vous savez que vous avez 2 utilisateurs, vous savez qu'ils seront uniques (clé primaire) donc vous savez que s'il y a 2 enregistrements, pour le même projet alors c'est celui que vous voulez.

Votre question indiquait que vous aviez un compte-rendu d'utilisateurs, vous savez donc quels utilisateurs et combien il y en a. le SQL ci-dessus pourrait être mis à jour pour accepter les paramètres de ces connus et reste donc dynamique, non limité à seulement 2 utilisateurs.

where user_ID in (userlist)
having count(*) = (cntuserList)

-----------Pour gérer la situation lorsque l'ensemble d'utilisateurs est vide-----

Select P.project_ID 
from Projects P
LEFT JOIN user_projects UP
where (UP.user_ID in (1,2) OR UP.USER_ID is null)
group by project_ID
Having count(*) = 2

Voici donc ce que cela fait. Il renvoie tous les projets et s'il y a un utilisateur affilié à ce projet, il les identifie. Si votre ensemble contient des utilisateurs, la liste des projets renvoyés est filtrée par cet ensemble en s'assurant que tout l'ensemble se trouve dans le projet via la clause having.

Si l'ensemble est vide, la jointure LEFT avec l'instruction userID is null conservera les projets sans utilisateurs répertoriés, que l'ensemble soit vide ou non. La clause having réduira davantage l'ensemble au nombre d'utilisateurs que vous avez défini dans l'ensemble, OU 0 indiquant renvoyer tous les projets sans utilisateur affecté.

Un cas marginal supplémentaire dont nous n'avons pas encore discuté est ce qui devrait se passer si un projet contient plus d'utilisateurs que ce que vous avez défini dans l'ensemble. Actuellement ce projet serait rendu; mais je ne suis pas certain que c'est ce que vous vouliez.

en passant merci de m'avoir fait réfléchir. Je n'arrive plus autant à entrer dans le code; c'est pourquoi je troll ici de temps en temps pour voir si je peux aider !