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!