PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Auswählen einer übereinstimmenden Teilmenge in einer Viele-zu-Viele-Beziehung

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

Sie wissen, dass Sie 2 Benutzer haben, Sie wissen, dass sie eindeutig sein werden (Primärschlüssel), also wissen Sie, dass wenn es 2 Datensätze für dasselbe Projekt gibt, dann ist es einer, den Sie wollen.

Ihre Frage hat angegeben, dass Sie eine GEGEBENE Anzahl von Benutzern gesendet haben, daher wissen Sie, welche Benutzer und wie viele es sind. Die obige SQL könnte aktualisiert werden, um Parameter für diese bekannten zu akzeptieren, und bleibt somit dynamisch, nicht auf nur 2 Benutzer beschränkt.

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

-----------Um eine Situation zu handhaben, in der die Benutzergruppe leer ist-----

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

Also hier ist, was das tut. Es gibt alle Projekte zurück und wenn es einen Benutzer gibt, der mit diesem Projekt verbunden ist, identifiziert es diesen>

Wenn die Menge leer ist, behält die LEFT-Join-Anweisung zusammen mit der userID is null-Anweisung die Projekte ohne Benutzer aufgelistet, unabhängig davon, ob die Menge leer ist oder nicht. Die Having-Klausel reduziert die Menge weiter auf die Anzahl der Benutzer, die Sie in der Menge definiert haben, ODER 0 gibt an, dass alle Projekte ohne zugewiesene Benutzer zurückgegeben werden.

Ein zusätzlicher Grenzfall, den wir noch nicht besprochen haben, ist, was passieren sollte, wenn ein Projekt mehr Benutzer enthält, als Sie in der Gruppe definiert haben. Derzeit würde dieses Projekt zurückgegeben werden; aber ich bin mir nicht sicher, ob du das wolltest.

nebenbei danke, dass du mich zum nachdenken gebracht hast. Ich kann nicht mehr so ​​viel in den Code einsteigen; Deshalb trolle ich hier ab und zu, um zu sehen, ob ich helfen kann!