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
}
}
}
}
}
}
}
您可能还想查看哪些允许您向架构中添加任意定制条件。您可能还想查看哪些允许您向架构中添加任意定制条件。