【问题标题】:Having Trouble Writing SQL query Many To Many Relationship编写 SQL 查询多对多关系时遇到问题
【发布时间】:2013-06-04 02:04:50
【问题描述】:

我有一个带有以下 postgres 数据库表的 Django 应用程序:发布和标签

Publication {
    title
    tags
}

Tag {
    title
}

Tag 和 Publication 具有多对多关系。

我想做的是做一个和/或组合搜索:例如,假设我有四个标签:A、B、C、D。我想找到所有具有 A OR B 标签的出版物它,以及与之关联的 C OR D 标记。例如,在搜索字段中,我可能会输入:(A || B) && (C || D)。换句话说,结果应该产生具有来自每个“或”对的至少一个标签的出版物。

我希望能够输入标签标题并返回出版物标题。

我尝试使用 Django 过滤器执行此操作,甚至昨天还问了这个问题:What is an Efficient Way to do an AND/OR Search Django-Postgres App? 并最终意识到执行原始续集查询可能更好。唯一的问题:我从来没有写过原始的续集声明。

我刚刚花了最后几个小时研究这个问题:How to filter SQL results in a has-many-through relation,并尝试将其应用于我的情况,但我太新手了,无法做到。

根据我的模型,谁能告诉我如何构造这个查询?

【问题讨论】:

    标签: sql django postgresql relational-division sql-match-all


    【解决方案1】:

    当然,您会有一个实现 n:m 关系的表。喜欢

    publication_tag {
        publication_id
        tag_id
    }
    

    那么您的查询可能如下所示:

    SELECT p.publication_id, p.publication
    FROM   publication p
    WHERE  EXISTS (SELECT 1 FROM publication_tag
                   WHERE  publication_id = p.publication_id
                   AND    tag_id IN ('A', 'B')
                  )
    AND    EXISTS (SELECT 1 FROM publication_tag
                   WHERE  publication_id = p.publication_id
                   AND    tag_id  IN ('C', 'D')
                  )
    

    这应该是最快的解决方案之一。您已经找到了go-to question,其中包含更多关于关系划分的示例查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多