В Postgres вы можете использовать тип массива , который в этом случае может значительно облегчить вашу жизнь и сделать таблицу books_tags устаревшей.
Рассмотрим следующую настройку:
create temp table if not exists tags(
id int,
name text
);
insert into tags(id, name)
values (1, 'Drama')
,(2, 'Comedy')
,(3, 'Thriller');
create temp table if not exists books(
id int,
title text,
status bool,
book_tags int[]
);
insert into books(id, title, status, book_tags)
values (1, 'SuperHero', false, array[1, 2])
,(2, 'Hobbit', true, array[2])
,(3, 'Marvel', true, null);
Теперь вы можете легко выполнять ваши запросы. например 1)
select book_tags
from books B
where B.id = 1;
Если вы хотите, чтобы теги были в отдельных строках, используйте функцию unnest()
, например,
select unnest(book_tags)
from books B
where B.id = 1;
и 2) найти все книги с tag in [2]
и status = true
select id, title, book_tags
from books B
where B.status = true
and B.book_tags @> array[2] -- set query tags in on right side
В вашем примере данных для книги 1 указано status=false
, поэтому array[1, 2]
не вернет никаких результатов с этими данными. Поэтому я установил в своем примере использование только одного тега.