首页 > 解决方案 > Postgresql 选择项目(书),如果它有两个或多个具有多对多关系的值(标签)

问题描述

我有桌子:

  1. 书籍(ID,...)
  2. tags_books(tag_id, book_id)

我怎样才能找到有两个或更多标签的书,比如说 tag_id (1,4,5)?它应该与 LIMIT/OFFSET 一起使用。

我唯一的想法是过滤 books_tags 是否有任何标签,而不是将它们聚集在数组中并过滤 array.length < 3 的行(当前搜索的总标签)。但我认为这不是一个合理的方法......

标签: sqlpostgresql

解决方案


您必须加入表格并按书分组。然后使用 HAVING 子句放置条件:

select 
  b.id
from books b inner join tags_books t
on t.book_id = b.id
where tag_id in (1,4,5)
group by b.id
having count(distinct tag_id) = 3

如果您不需要书籍具有所有 3 个标签但其中任何一个标签,则删除 HAVING 子句。
如果您想要至少 2 个标签,请更改为:

having count(distinct tag_id) >= 2

推荐阅读