sql >> Databáze >  >> RDS >> PostgreSQL

Výběr odpovídající podmnožiny ve vztahu mnoho k mnoha

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

Víte, že máte 2 uživatele, víte, že budou unikátní (primární klíč), takže víte, že pokud existují 2 záznamy pro stejný projekt, pak je to ten, který chcete.

Z vašeho dotazu vyplývá, že máte GIVEN zaslaných uživatelů, takže víte, jací uživatelé a kolik jich je. výše uvedený SQL by mohl být aktualizován tak, aby akceptoval parametry pro tyto známé, a tak zůstává dynamický, není omezen pouze na 2 uživatele.

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

-----------Zvládnutí situace, kdy je množina uživatelů prázdná-----

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

Takže tady je to, co to dělá. Vrátí všechny projekty a pokud je k tomuto projektu přidružen uživatel, identifikuje ho. Pokud sada obsahuje uživatele, seznam vrácených projektů je filtrován touto sadou a zajišťuje, že celá sada je v projektu prostřednictvím klauzule have.

Pokud je sada prázdná, LEVÉ spojení spolu s příkazem userID is null udrží projekty bez uvedených uživatelů bez ohledu na to, zda je sada prázdná nebo ne. Klauzule have dále zredukuje sadu na počet uživatelů, které jste v sadě definovali, NEBO 0 znamená, že vrátíte všechny projekty bez přiřazených uživatelů.

Další okrajový případ, o kterém jsme ještě nemluvili, je to, co by se mělo stát, pokud projekt obsahuje více uživatelů, než kolik jste definovali v sadě. V současnosti bude tento projekt vrácen; ale nejsem si jistý, že to je to, co jsi chtěl.

na okraj děkuji, že jste mě donutil přemýšlet. Už se do kódu tolik nedostanu; proto sem čas od času trolluji, abych zjistil, jestli mohu pomoci!



  1. Pochopení systémových sloupců v PostgreSQL

  2. Jak nakonfigurovat replikaci clusteru do clusteru pro cluster Percona XtraDB nebo MariaDB Cluster

  3. odstranit konkrétní slovo z řetězce

  4. Problém s vkládáním MySQL do Node.js