sql >> Database >  >> RDS >> PostgreSQL

Overeenkomende subset selecteren in veel-op-veel-relatie

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

Je weet dat je 2 gebruikers hebt, je weet dat ze uniek zullen zijn (primaire sleutel), dus je weet dat als er 2 records zijn, voor hetzelfde project, het er een is die je wilt.

Uw vraag gaf aan dat u een GEGEVEN van gebruikers hebt verzonden, daarom weet u welke gebruikers en hoeveel er zijn. de bovenstaande SQL kan worden bijgewerkt om parameters voor deze bekende te accepteren en blijft dus dynamisch, niet beperkt tot slechts 2 gebruikers.

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

-----------Om de situatie af te handelen wanneer de set gebruikers leeg is -----

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

Dus dit is wat dit doet. Het retourneert alle projecten en als er een gebruiker aan dat project is gelieerd, identificeert het deze. Als je set gebruikers bevat, wordt de lijst met geretourneerde projecten gefilterd door die set, zodat de hele set in het project zit via de hebbende clausule.

Als de set leeg is, zorgt de LEFT-join samen met de userID is null-instructie ervoor dat de projecten zonder gebruikers worden vermeld, ongeacht of de set leeg is of niet. De hebbende clausule zal de set verder reduceren tot het # gebruikers dat u in de set hebt gedefinieerd, OF 0 om alle projecten terug te geven waaraan geen gebruikers zijn toegewezen.

Een extra randgeval dat we nog niet hebben besproken, is wat er moet gebeuren als een project meer gebruikers bevat dan wat u in de set hebt gedefinieerd. Op dit moment zou dit project worden geretourneerd; maar ik ben er niet zeker van dat je dat wilde.

even terzijde bedankt om me aan het denken te zetten. Ik kom niet meer zo vaak in de code; daarom troll ik hier af en toe om te zien of ik kan helpen!



  1. MySQL-vriendentabel

  2. Mysql-query om te bepalen of de opgegeven datetime is opgenomen in het datetime-interval

  3. Laravel 1048 Kolom kan niet NULL zijn bij het opslaan van gegevens

  4. Hoe automatisch opnieuw te plaatsen na het gebruik van identity_insert?