【问题标题】:Finding entries with all relations in a relational database table在关系数据库表中查找具有所有关系的条目
【发布时间】:2020-10-21 13:28:48
【问题描述】:

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

  • 对象

  • 匹配

  • 标签

其中 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


    【解决方案1】:

    您可以将所有标签作为数组传递并使用Carray() 函数或以逗号分隔的字符串并以this 的方式将其转换为表格。 然后对于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>)
    

    Fiddle here.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 2010-11-02
      相关资源
      最近更新 更多