首页 > 解决方案 > 在关系数据库表中查找具有所有关系的条目

问题描述

我正在使用标签制作关系数据库。该数据库有三个表:

其中 match 是对象和标签之间的简单关系(即每个条目由一个主键和两个外键组成)。我想构造一个查询,我可以在其中找到具有所有给定标签的所有对象,但不确定如何去做。

例如,这些是三个表:

  1. 死亡变成了她
  2. 比利麦迪逊
  1. 喜剧
  2. 恐怖
  1. 1 | 1
  2. 1 | 2
  3. 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

标签: sql

解决方案


例如,您可以将所有标签作为数组传递并使用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>)

在这里拉小提琴


推荐阅读