Select project_ID
from user_projects
where user_ID in (1,2)
group by project_ID
Having count(*) = 2
Знаете, че имате 2 потребители, знаете, че те ще бъдат уникални (първичен ключ), така че знаете, че ако има 2 записа за един и същи проект, това е този, който искате.
Вашият въпрос показва, че имате ДАДЕНО изпратени потребители, затова знаете какви потребители и колко са. горният SQL може да бъде актуализиран, за да приема параметри за тези известни и по този начин да остане динамичен, без да се ограничава само до 2 потребители.
where user_ID in (userlist)
having count(*) = (cntuserList)
-----------За справяне със ситуация, когато наборът от потребители е празен-----
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
И така, ето какво прави това. Той връща всички проекти и ако има потребител, свързан с този проект, той ги идентифицира. Ако зададете съдържа потребители, списъкът с върнатите проекти се филтрира от този набор, като се гарантира, че целият набор е в проекта чрез клаузата за притежаване.
Ако наборът е празен, съединението LEFT заедно с оператора userID is null ще запази проектите без изброени потребители, независимо дали наборът е празен или не. Клаузата за наличие допълнително ще намали набора до # потребители, които сте дефинирали в набора, ИЛИ 0, което показва връщане на всички проекти без зададени потребители.
Един допълнителен крайен случай, който все още не сме обсъдили, е какво трябва да се случи, ако даден проект съдържа повече потребители от това, което сте дефинирали в набора. В момента този проект ще бъде върнат; но не съм сигурен, че искаш точно това.
на странична бележка благодаря, че ме накара да се замисля. Вече не мога да навлизам толкова много в кода; ето защо тролим тук от време на време, за да видя дали мога да помогна!