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
これが何をするのかです。すべてのプロジェクトを返し、そのプロジェクトに関連付けられているユーザーがいる場合はそれらを識別します。セットにユーザーが含まれている場合、返されるプロジェクトのリストはそのセットによってフィルタリングされ、セット全体がhave句を介してプロジェクトに含まれるようになります。
>セットが空の場合、userID is nullステートメントとともにLEFT結合は、セットが空であるかどうかに関係なく、ユーザーがリストされていないプロジェクトを保持します。持つ句は、セットをさらにセットで定義したユーザーの数に減らします。または0は、ユーザーが割り当てられていないすべてのプロジェクトを返すことを示します。
まだ説明しなかったもう1つのエッジケースは、プロジェクトにセットで定義したよりも多くのユーザーが含まれている場合にどうなるかです。現在、このプロジェクトは返還されます。しかし、私はそれがあなたが望んでいたことであるとは確信していません。
ちなみに私に考えさせてくれてありがとう。私はもうコードに入ることができません。だから私は時々ここをトロールして助けてくれるかどうか確かめます!