sql - Postgresql 选择项目(书),如果它有两个或多个具有多对多关系的值(标签)
问题描述
我有桌子:
- 书籍(ID,...)
- tags_books(tag_id, book_id)
我怎样才能找到有两个或更多标签的书,比如说 tag_id (1,4,5)?它应该与 LIMIT/OFFSET 一起使用。
我唯一的想法是过滤 books_tags 是否有任何标签,而不是将它们聚集在数组中并过滤 array.length < 3 的行(当前搜索的总标签)。但我认为这不是一个合理的方法......
解决方案
您必须加入表格并按书分组。然后使用 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
推荐阅读
- django - 如何在 django 中设置模板目录。?
- tensorflow - TFRecord 应该包含多个观察值还是一个?
- swift - 在 SwiftUI 中,如何更改 List 堆叠行的方式?
- typescript - 正确的类型特化
- python - ImportError:无法从“matplotlib.cbook”导入名称“is_string_like”
- javascript - 在模式中单击单元格或作为弹出窗口或警报对话框时显示表格单元格详细信息
- django - 如何使 Django Admin 中的所有“内联”可折叠项目默认打开?
- ios - Xcode 11.4 错误 - 无法在设备上安装一个或多个配置文件
- firebase - Firebase Firestore 与 Expo v37
- reactjs - React assinging array vaiable,哪一个是最好的?