PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Selezione del sottoinsieme corrispondente nella relazione molti-a-molti

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

Sai che hai 2 utenti, sai che saranno univoci (chiave primaria) quindi sai che se ci sono 2 record, per lo stesso progetto allora è quello che vuoi.

La tua domanda ha indicato che hai un GIVEN inviato di utenti, quindi sai quali utenti e quanti sono. l'SQL di cui sopra potrebbe essere aggiornato per accettare parametri per questi noti e quindi rimane dinamico, non limitato a soli 2 utenti.

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

-----------Per gestire la situazione quando il set di utenti è vuoto-----

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

Quindi ecco cosa fa. Restituisce tutti i progetti e se c'è un utente affiliato a quel progetto lo identifica. Se il set contiene utenti, l'elenco dei progetti restituiti viene filtrato da quel set assicurando che l'intero set sia nel progetto tramite la clausola having.

Se il set è vuoto, il join LEFT insieme all'istruzione userID is null manterrà i progetti senza utenti elencati indipendentemente dal fatto che il set sia vuoto o meno. La clausola having ridurrà ulteriormente il set al numero di utenti che hai definito nel set, OPPURE 0 indicando restituisci tutti i progetti senza utenti assegnati.

Un ulteriore caso limite di cui non abbiamo ancora discusso è cosa dovrebbe accadere se un progetto contiene più utenti di quelli che hai definito nel set. Attualmente questo progetto verrebbe restituito; ma non sono sicuro che fosse quello che volevi.

in una nota a margine grazie per avermi fatto pensare. Non riesco più a entrare tanto nel codice; ecco perché di tanto in tanto trollo qui per vedere se posso aiutare!