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

Valg af matchende delmængde i mange-til-mange-relation

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

Du ved, at du har 2 brugere, du ved, at de vil være unikke (primær nøgle), så du ved, at hvis der er 2 poster, for det samme projekt, så er det én, du vil have.

Dit spørgsmål indikerede, at du har en GIVET sendt af brugere, så du ved, hvilke brugere og hvor mange der er. ovenstående SQL kunne opdateres til at acceptere parametre for disse kendte og forbliver således dynamisk, ikke begrænset til kun 2 brugere.

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

-----------Til at håndtere situationen, hvor brugersættet er tomt-----

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

Så her er hvad dette gør. Den returnerer alle projekter, og hvis der er en bruger tilknyttet det pågældende projekt, identificerer den dem. Hvis du angiver indeholder brugere, filtreres listen over returnerede projekter af det sæt, hvilket sikrer, at hele sættet er i projektet gennem have-klausulen.

Hvis sættet er tomt, vil LEFT join sammen med userID is null-sætningen beholde projekterne uden brugere på listen, uanset om sættet er tomt eller ej. Have-klausulen vil yderligere reducere sættet til det antal brugere, du definerede i sættet, ELLER 0, der angiver at returnere alle projekter uden tildelte brugere.

Et yderligere edge-case, som vi endnu ikke har diskuteret, er, hvad der skal ske, hvis et projekt indeholder flere brugere end det, du definerede i sættet. I øjeblikket ville dette projekt blive returneret; men jeg er ikke sikker på, at det var det, du ønskede.

på en sidebemærkning tak fordi du fik mig til at tænke. Jeg kommer ikke så meget ind på koden længere; derfor troller jeg her fra tid til anden for at se, om jeg kan hjælpe!



  1. I MySQL er det muligt at få mere end 1024 tegn tilbage fra GROUP_CONCAT

  2. hibernate map java Long til MySQL BIGINT fejl

  3. Generel fejl:1008 OCISTmtExecute:ORA-01008:ikke alle variable er bundet

  4. Hibernate @Filter samling af enums