【问题标题】: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;
    $$;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多