Select project_ID
from user_projects
where user_ID in (1,2)
group by project_ID
Having count(*) = 2
Anda tahu bahwa Anda memiliki 2 pengguna, Anda tahu bahwa mereka akan unik (kunci utama) sehingga Anda tahu bahwa jika ada 2 catatan, untuk proyek yang sama maka itu yang Anda inginkan.
Pertanyaan Anda menunjukkan bahwa Anda memiliki GIVEN yang dikirim dari pengguna sehingga Anda tahu pengguna apa dan berapa jumlahnya. SQL di atas dapat diperbarui untuk menerima parameter yang diketahui ini dan dengan demikian tetap dinamis, tidak terbatas hanya pada 2 pengguna.
where user_ID in (userlist)
having count(*) = (cntuserList)
-----------Untuk menangani situasi ketika set pengguna kosong------P>
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
Jadi inilah yang dilakukannya. Ini mengembalikan semua proyek dan jika ada pengguna yang berafiliasi dengan proyek itu, itu mengidentifikasi mereka. Jika Anda menetapkan berisi pengguna, daftar proyek yang dikembalikan difilter oleh set itu memastikan bahwa seluruh set ada di proyek melalui klausa memiliki.
Jika set kosong, LEFT join bersama dengan userID is null pernyataan akan membuat proyek tanpa pengguna terdaftar terlepas dari apakah set kosong atau tidak. Klausa memiliki selanjutnya akan mengurangi set ke # pengguna yang Anda tetapkan di set, ATAU 0 menunjukkan kembalikan semua proyek tanpa pengguna yang ditetapkan.
Satu kasus tepi tambahan yang belum kami diskusikan adalah apa yang akan terjadi jika sebuah proyek berisi lebih banyak pengguna daripada yang Anda tetapkan di set. Saat ini proyek ini akan dikembalikan; tapi saya tidak yakin itu yang Anda inginkan.
di samping catatan terima kasih untuk membuat saya berpikir. Saya tidak bisa masuk ke dalam kode sebanyak itu lagi; itulah sebabnya saya sering bermain-main di sini untuk melihat apakah saya dapat membantu!