无法编写SQL查询多对多关系

时间:2013-06-07 17:17:41

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

我有一个带有以下postgres db表的Django应用程序:Publication和Tag

Publication {
    title
    tags
}

Tag {
    title
}

标签和出版物有很多关系。

我想做的是做一个和/或组合搜索:例如,假设我有四个标签:A,B,C,D。我想找到所有与A OR B标签关联的出版物它,以及与之关联的C或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,并尝试将它应用到我的环境中,但是我太过新手了能够做到这一点。

鉴于我的模型,有人能告诉我如何构建这个查询吗?

1 个答案:

答案 0 :(得分:4)

当然,你会有一个实现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,其中包含更多针对关系分部的示例查询。