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
这就是它的作用。它返回所有项目,如果有用户附属于该项目,它会识别它们。
如果您设置包含用户,则返回的项目列表将按该集进行筛选,确保整个集通过having 子句位于项目中。
如果集合为空,则 LEFT 连接以及 userID is null 语句将保留未列出用户的项目,无论集合是否为空。 having 子句将进一步将集合减少到您在集合中定义的用户数量,或者 0 表示返回所有未分配用户的项目。
我们尚未讨论的另一个边缘情况是,如果项目包含的用户数量多于您在集合中定义的用户数量,将会发生什么情况。目前该项目将被归还;但我不确定这就是你想要的。
顺便说一句,谢谢你让我思考。我不再那么深入地研究代码了;这就是为什么我时不时地来这里看看我是否可以提供帮助!