Postgres: сопоставить множественные значения в соединительной таблице - PullRequest
1 голос
/ 25 марта 2020

У меня есть сообщение в таблице

POST TABLE
id | name
 1 | post1
 2 | post2

У меня есть категория сообщения в таблице соединений

POST CATEGORY (JOINT TABLE)
id | post_id  | post_category_id
 1 |       1  |               10
 2 |       1  |               11
 3 |       2  |               11

Как мне выбрать сообщения, имеющие ОБА post_category_id 10 и 11?

Требуется результат:

POST TABLE
id | name
 1 | post1

1 Ответ

0 голосов
/ 25 марта 2020

Один метод использует exists:

select p.*
from posts p
where exists (select 1
              from postcategory pc
              where pc.post_id = p.id and pc.category = 10
             ) and
      exists (select 1
              from postcategory pc
              where pc.post_id = p.id and pc.category = 11
             ) ;

Если вы просто хотели идентификаторы, я бы предложил агрегирование:

select pc.post_id
from postcategory pc
where pc.category in (10, 11)
group by pc.post_id
having count(*) = 2;  -- use count(distinct category) if the table can have duplicates

Конечно, вы можете join в posts и используйте этот метод.

...