sql - 在关系数据库表中查找具有所有关系的条目
问题描述
我正在使用标签制作关系数据库。该数据库有三个表:
目的
匹配
标签
其中 match 是对象和标签之间的简单关系(即每个条目由一个主键和两个外键组成)。我想构造一个查询,我可以在其中找到具有所有给定标签的所有对象,但不确定如何去做。
例如,这些是三个表:
- 目的
- 死亡变成了她
- 比利麦迪逊
- 标签
- 喜剧
- 恐怖
- 匹配
- 1 | 1
- 1 | 2
- 2 | 1
鉴于有人想要一部恐怖喜剧,我如何构造查询以仅查找具有所有匹配项的对象?我意识到这是基本的,但我真的没有找到任何答案。如果整个架构都关闭了,请随时指出这一点。
作为记录,我使用的是 Python、SQLAlchemy 和 SQLite。目前,我已经列出了要在 Match 中找到的所有标签 ID。
编辑:对于任何将来的参考,我使用了 astentx 的解决方案,对查询稍作修改,以便立即从对象访问数据:
select object.Length, object.title
from object
join match
on object.id = match.object
join tag
on match.tag = tag.id
join filter_tags
on tag.name = filter_tags.word
解决方案
例如,您可以将所有标签作为数组传递并使用Carray()函数或以逗号分隔的字符串并以这种方式将其转换为表格。然后对于AND
条件选择与您预期的标签完全相同的行:
select relation.obj_id
from relation
join tags
on relation.tag_id = tags.id
join <generated table>
on tagsvalue = <generated table>.value
group by relation.obj_id
having count(1) = (select count(1) from <generated table>)
推荐阅读
- postgresql - PLTCL 函数 NEW($1) 不会返回所需的结果
- c# - 带有 .Net 后端的 Angular。HttpErroResponse
- python - 使用 Pandas,如何在使用条件语句时计算多行列的平均值?
- bnf - Coco 以 params 为语句解析语句
- swift - SwiftUI - 代码中的 ForEach 循环未显示在选项卡上
- azure - Azure SQL 数据库有时连接缓慢
- java - Soapmessage 添加命名空间
- c++ - 没有显示视频 (GUI) 时,是否可以允许与 MPV C API 进行键绑定?
- java - 超级缩减字符串:我的代码有问题 - Java
- r - 为每条边查找间接节点(在 R 中)