【问题标题】:sql query based on given set of values that need to be satisfied基于需要满足的给定值集的sql查询
【发布时间】:2022-10-23 16:07:57
【问题描述】:
我需要一个 postgresql 查询来返回我的企业 ID。
快速表设置:
商家包含 0 个或多个卡片,卡片包含 0 个或多个部分,部分包含 0 个或多个产品,产品包含 0 个或多个标签。
问题
我需要的查询是针对以下情况:
用户传入与产品相关联的标签 ID 列表。结果应包含满足以下条件的产品的企业(ID)所有给定的标签 ID.
我创建了一个部分工作的查询,因为它在至少一个标签 ID 匹配时返回业务 ID。
select businesses.id from businesses
left join cards on cards.id_business = businesses.id left join sections on sections.id_card = cards.id
left join products on products.id_section = sections.id
left join product_tags on product_tags.id_product = products.id
left join tags on tags.id = product_tags.id_tag
where product_tags.id_tag in (40, -1);
表中不存在 id -1 的标签,我仍然得到包含 id 40 的标签的企业,因为它有一个包含此标签的产品..
Database Schema
【问题讨论】:
标签:
postgresql
foreign-keys
【解决方案1】:
我解决了这个问题,实际上我只需要获取 idTag 在给定 id 列表中的所有条目,然后按 tagid 分组并计算给定 id 的计数(我修改了返回值以包含所有列,而不仅仅是匹配企业的ID):
CREATE FUNCTION public.businesses_for_tags(tag_ids integer[]) RETURNS SETOF public.businesses
LANGUAGE
plpgsql
AS $$
BEGIN
return query
select b.*
from businesses b
left join cards c on c.id_business =b.id
left join sections s on c.id = s.id_card
left join products p on p.id_section = s.id
left join product_tags pt on pt.id_product = p.id
left join tags t on t.id = pt.id_tag
where pt.id_tag = any (tag_ids)
group by b.id
having count(distinct(pt.id_tag)) = array_length(tag_ids, 1) ;
end;
$$;