sql >> Base de Datos >  >> RDS >> PostgreSQL

Selección de un subconjunto coincidente en una relación de muchos a muchos

Select project_ID 
from user_projects
where user_ID in (1,2)
group by project_ID
Having count(*) = 2

Sabe que tiene 2 usuarios, sabe que serán únicos (clave principal), por lo que sabe que si hay 2 registros, para el mismo proyecto, entonces es el que desea.

Su pregunta indicó que tiene un envío DADO de usuarios, por lo tanto, sabe qué usuarios y cuántos hay. el SQL anterior podría actualizarse para aceptar parámetros para estos conocidos y, por lo tanto, permanecer dinámico, no limitado a solo 2 usuarios.

where user_ID in (userlist)
having count(*) = (cntuserList)

-----------Para manejar la situación cuando el conjunto de usuarios está vacío-----

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

Esto es lo que hace esto. Devuelve todos los proyectos y, si hay un usuario afiliado a ese proyecto, lo identifica. Si el conjunto contiene usuarios, la lista de proyectos devueltos se filtra por ese conjunto, lo que garantiza que el conjunto completo esté en el proyecto a través de la cláusula que tiene.

Si el conjunto está vacío, la combinación IZQUIERDA junto con el ID de usuario es una declaración nula mantendrá los proyectos sin usuarios en la lista, independientemente de si el conjunto está vacío o no. La cláusula de tener reducirá aún más el conjunto al número de usuarios que definió en el conjunto, O 0, lo que indica devolver todos los proyectos sin usuarios asignados.

Un caso extremo adicional que aún no discutimos es qué debería suceder si un proyecto contiene más usuarios de los que definió en el conjunto. Actualmente este proyecto sería devuelto; pero no estoy seguro de que eso sea lo que querías.

en una nota al margen gracias por hacerme pensar. Ya no me meto tanto en el código; ¡Es por eso que troleo aquí de vez en cuando para ver si puedo ayudar!