Postgresql 查询相关表主键上的多:多关系(即按相关表列过滤)

Postgresql 查询相关表主键上的多:多关系(即按相关表列过滤),postgresql,graphql,postgraphile,Postgresql,Graphql,Postgraphile,我在两个表之间有一个多对多关系:note和tag,我希望能够通过它们的tagId搜索所有注释。因为很多:很多,我有一个连接表note\u tag 我的目标是在Postgraphile生成的Graphql模式上公开一个计算字段,可以查询该字段以及note表的其他属性 我正在玩postgraphile插件连接过滤器。这个插件可以通过authord(应该是1:many)之类的东西进行过滤,但我无法理解如何通过many:many进行过滤。我的note表中有一个计算列,名为tags,它是JSON。有没有办

我在两个表之间有一个多对多关系:
note
tag
,我希望能够通过它们的
tagId
搜索所有注释。因为很多:很多,我有一个连接表
note\u tag

我的目标是在Postgraphile生成的Graphql模式上公开一个计算字段,可以查询该字段以及
note
表的其他属性

我正在玩
postgraphile插件连接过滤器
。这个插件可以通过authord(应该是1:many)之类的东西进行过滤,但我无法理解如何通过many:many进行过滤。我的note表中有一个计算列,名为
tags
,它是JSON。有没有办法“查看”这个json并找出id=1的位置

这是我的计算列
标记

    create or replace function note_tags(note note, tagid text)
        returns jsonb as $$
            select
                json_strip_nulls(
                    json_agg(
                        json_build_object(
                            'title', tag.title, 
                            'id', tag.id,
                        ) 
                    )
                )::jsonb 
            from note
            inner join note_tag on note_tag.tag_id = tagid and note_tag.note_id = note.id
            left join note_tag nt on note.id = nt.note_id 
            left join tag on nt.tag_id = tag.id
            where note.account_id = '1'
            group by note.id, note.title;
        $$ language sql stable;
根据我对上述函数的理解,我将根据(给函数的)tagid返回jsonb:
内部连接note\u-tag on-note\u-tag.tag\u-id=tagid
。那么,当计算列时,为什么json不被
id
过滤呢

我试图提出这样一个问题:

query notesByTagId {
  notes {
    edges {
      node {
        title
        id
        tags(tagid: "1")
      }
    }
  }
}
但是现在当我执行这个查询时,我在
标记
字段中得到了字符串化的JSON。但是,所有标记都包含在json中,不管注释是否真正属于该标记

例如,id=1的注释应该只包含id=1和id=2的标记。现在它返回数据库中的每个标记

{
  "data": {
    "notes": {
      "edges": [
        {
          "node": {
            "id": "1",
            "tags": "[{\"id\":\"1\",\"title\":\"Psychology\"},{\"id\":\"2\",\"title\":\"Logic\"},{\"id\":\"3\",\"title\":\"Charisma\"}]",
            ...
这个计算列的关键因素是JSON必须包含注释所属的所有标记,即使我们在单个
tagid

这是我的简化表格

注:

标签:

注:标签:

create table note_tag(
  note_id text FK references note.id
  tag_id text FK references tag.id
)
更新 我稍微改变了一下方法,并尝试了以下功能:

    create or replace function note_tags(n note)
        returns setof tag as $$
            select tag.*
            from tag
            inner join note_tag on (note_tag.tag_id = tag.id)
            where note_tag.note_id = n.id;
        $$ language sql stable;
我能够检索填充了
标记的所有注释
字段,但现在我需要能够过滤掉不属于特定标记的注释,同时仍然保留属于给定注释的所有标记


所以问题仍然和上面一样:我们如何根据相关表的PK筛选表?

经过一段时间的挖掘,我认为我找到了一个很好的方法。基于,我创建了一个函数,通过给定的
tagid
返回所有
notes

这是:

    create or replace function all_notes_with_tag_id(tagid text)
        returns setof note as $$
            select distinct note.*
            from tag
            inner join note_tag on (note_tag.tag_id = tag.id)
            inner join note on (note_tag.note_id = note.id)
            where tag.id = tagid;
        $$ language sql stable;
方法中的错误是期望计算列完成所有工作,而它唯一的工作应该是获取所有数据。现在可以在graphql中直接调用此函数
所有具有\u bucket\u id的\u nuggets\u
,如下所示:

query MyQuery($tagid: String!) {
  allNotesWithTagId(tagid: $tagid) {
    edges {
      node {
        id
        title
        tags {
          edges {
            node {
              id
              title
            }
          }
        }
      }
    }
  }
}

经过一段时间的挖掘,我想我找到了一个好方法。基于,我创建了一个函数,通过给定的
tagid
返回所有
notes

这是:

    create or replace function all_notes_with_tag_id(tagid text)
        returns setof note as $$
            select distinct note.*
            from tag
            inner join note_tag on (note_tag.tag_id = tag.id)
            inner join note on (note_tag.note_id = note.id)
            where tag.id = tagid;
        $$ language sql stable;
方法中的错误是期望计算列完成所有工作,而它唯一的工作应该是获取所有数据。现在可以在graphql中直接调用此函数
所有具有\u bucket\u id的\u nuggets\u
,如下所示:

query MyQuery($tagid: String!) {
  allNotesWithTagId(tagid: $tagid) {
    edges {
      node {
        id
        title
        tags {
          edges {
            node {
              id
              title
            }
          }
        }
      }
    }
  }
}

您可能还想查看哪些允许您向架构中添加任意定制条件。您可能还想查看哪些允许您向架构中添加任意定制条件。