查询多对多记录匹配
query for many to many record matching
我有tabletag_store如下
我想过滤所有在like中提供的标签的id
SELECT st.id from public."tag_store" st
inner join
(SELECT x.tg_type,x.tg_value FROM json_to_recordset
('[{ "tg_type":1, "tg_value ":"cd"},{ "tg_type":2,"tg_value ":"tg"},{ "tg_type":3,"tg_value ":"po" }] '::json)
AS x (tg_type int, tg_value TEXT)) ftg
on st.tg_type= ftg.tg_type
and st.tg_value = ftg.tg_value order by st.id;
我想要的输出是它应该只输出 id 1,因为它匹配所有三个 tg_value 和 tg_id..
求助,我应该怎么改,或者有什么更好的替代方案
谢谢
我会将这些值聚合到一个 JSON 数组中,并使用 @>
运算符过滤那些包含所有值的数组:
with tags as (
select id, jsonb_agg(jsonb_build_object('tg_id', tag_id, 'tg_value', tag_value)) all_tags
from tag_store
group by id
)
select *
from tags
where all_tags @> '[{"tg_id":1, "tg_value": "cd"},
{"tg_id":2, "tg_value": "tg"},
{"tg_id":3, "tg_value": "po"}]'
;
如果需要,您也可以直接在 HAVING 子句中执行此操作
select id
from tag_store
group by id
having jsonb_agg(jsonb_build_object('tg_id', tag_id, 'tg_value', tag_value))
@> '[{"tg_id":1, "tg_value": "cd"},
{"tg_id":2, "tg_value": "tg"},
{"tg_id":3, "tg_value": "po"}]'
;
请注意,这将 return 个具有 附加 标签的 ID,而不是比较数组中的标签。
我有tabletag_store如下
我想过滤所有在like中提供的标签的id
SELECT st.id from public."tag_store" st
inner join
(SELECT x.tg_type,x.tg_value FROM json_to_recordset
('[{ "tg_type":1, "tg_value ":"cd"},{ "tg_type":2,"tg_value ":"tg"},{ "tg_type":3,"tg_value ":"po" }] '::json)
AS x (tg_type int, tg_value TEXT)) ftg
on st.tg_type= ftg.tg_type
and st.tg_value = ftg.tg_value order by st.id;
我想要的输出是它应该只输出 id 1,因为它匹配所有三个 tg_value 和 tg_id..
求助,我应该怎么改,或者有什么更好的替代方案
谢谢
我会将这些值聚合到一个 JSON 数组中,并使用 @>
运算符过滤那些包含所有值的数组:
with tags as (
select id, jsonb_agg(jsonb_build_object('tg_id', tag_id, 'tg_value', tag_value)) all_tags
from tag_store
group by id
)
select *
from tags
where all_tags @> '[{"tg_id":1, "tg_value": "cd"},
{"tg_id":2, "tg_value": "tg"},
{"tg_id":3, "tg_value": "po"}]'
;
如果需要,您也可以直接在 HAVING 子句中执行此操作
select id
from tag_store
group by id
having jsonb_agg(jsonb_build_object('tg_id', tag_id, 'tg_value', tag_value))
@> '[{"tg_id":1, "tg_value": "cd"},
{"tg_id":2, "tg_value": "tg"},
{"tg_id":3, "tg_value": "po"}]'
;
请注意,这将 return 个具有 附加 标签的 ID,而不是比较数组中的标签。