PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Избиране на съответстващо подмножество в отношение много към много

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, което показва връщане на всички проекти без зададени потребители.

Един допълнителен крайен случай, който все още не сме обсъдили, е какво трябва да се случи, ако даден проект съдържа повече потребители от това, което сте дефинирали в набора. В момента този проект ще бъде върнат; но не съм сигурен, че искаш точно това.

на странична бележка благодаря, че ме накара да се замисля. Вече не мога да навлизам толкова много в кода; ето защо тролим тук от време на време, за да видя дали мога да помогна!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rails:разрешението е отказано за relation schema_migrations

  2. Инсталирайте utf8 collation в PostgreSQL

  3. Ако е възможно, как може да се вгради PostgreSQL?

  4. Python unittest (използвайки SQLAlchemy) не записва/актуализира база данни?

  5. Postgres - Това ли е правилният начин за създаване на частичен индекс на булева колона?