Select project_ID
from user_projects
where user_ID in (1,2)
group by project_ID
Having count(*) = 2
Wiesz, że masz 2 użytkowników, wiesz, że będą oni unikalni (klucz podstawowy), więc wiesz, że jeśli są 2 rekordy dla tego samego projektu, to właśnie tego chcesz.
Twoje pytanie wskazało, że masz GIVEN wysłanych użytkowników, dlatego wiesz, jacy użytkownicy i ilu ich jest. powyższy kod SQL może zostać zaktualizowany, aby zaakceptować parametry dla tych znanych, a zatem pozostaje dynamiczny, nie ograniczając się tylko do 2 użytkowników.
where user_ID in (userlist)
having count(*) = (cntuserList)
-----------Do obsługi sytuacji, gdy zbiór użytkowników jest pusty-----
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
Oto, co to robi. Zwraca wszystkie projekty, a jeśli istnieje użytkownik powiązany z tym projektem, identyfikuje go. Jeśli zestaw zawiera użytkowników, lista zwróconych projektów jest filtrowana według tego zestawu, zapewniając, że cały zestaw znajduje się w projekcie za pomocą klauzuli have.
Jeśli zestaw jest pusty, lewe sprzężenie wraz z instrukcją userID is null zachowa projekty bez użytkowników na liście, niezależnie od tego, czy zestaw jest pusty, czy nie. Klauzula having dalej zmniejszy zbiór do liczby użytkowników zdefiniowanych w zbiorze LUB 0 wskazujące zwrócenie wszystkich projektów bez przypisanych użytkowników.
Dodatkowym przypadkiem brzegowym, którego jeszcze nie omawialiśmy, jest to, co powinno się stać, jeśli projekt zawiera więcej użytkowników niż zdefiniowano w zestawie. Niebawem ten projekt zostanie zwrócony; ale nie jestem przekonany, że tego chciałeś.
na marginesie dzięki za skłonienie mnie do myślenia. Nie zagłębiam się już w kod; dlatego od czasu do czasu tu troluję, żeby sprawdzić, czy mogę pomóc!