查询以列方式列出带有类别组的分层类别的所有父级

Query to list all parents of a hierarchical category in column wise with category group

我有3个Table一个是categories

 id    |    name             |    parentid       |   categorygroupid
---------------------------------------------------------------------
  1         Fruits                    0                    1
  2         Citrus Fruits             1                    2
  3         Oranges                   2                    3
  4         Limes                     2                    3
  5         Melons                    1                    2
  6         watermelons               5                    3
  7         vegetables                0                    1
  8         onion                     7                    3
  9         potato                    7                    3
---------------------------------------------------------------------


CREATE TABLE categories
(
    id bigint ,
    name character varying(100) COLLATE pg_catalog."default",
    parentid bigint,
    categorygroupid bigint
)

insert into categories (id,name,parentid,categorygroupid)values('1','Fruits','0','1');
insert into categories (id,name,parentid,categorygroupid)values('2','Citrus Fruits','1','2');
insert into categories (id,name,parentid,categorygroupid)values('3','Oranges','2','3');
insert into categories (id,name,parentid,categorygroupid)values('4','Limes','2','3');
insert into categories (id,name,parentid,categorygroupid)values('5','Melons','1','2');
insert into categories (id,name,parentid,categorygroupid)values('6','watermelons','5','3');
insert into categories (id,name,parentId,categorygroupid)values('7','vegetables','0','1');
insert into categories (id,name,parentid,categorygroupid)values('8','onion','7','3');
insert into categories (id,name,parentid,categorygroupid)values('9','potato','7','3');

第二个table是categorygroups

 id     groupname    
 ------------------------
  1     Item Group
  2     Category Type
  3     Category
 ------------------------

CREATE TABLE categorygroups
(
    id bigint ,
    groupname character varying(150) COLLATE pg_catalog."default"
)

insert into categorygroups(id,groupname)values('1','Item Group');
insert into categorygroups(id,groupname)values('2','Category Type');
insert into categorygroups(id,groupname)values('3','Category');

第三个table是items

id   |    itemname      |    categoryid
------------------------------------------
1        ABC-ORANGE              3
2        DEF-ORANGE              3
3        AB-WaterMelons          5
4        MN-onion                8
5        PQ-potato               9
------------------------------------------

CREATE TABLE items
(
    id bigint ,
    itemname character varying(250) COLLATE pg_catalog."default",
    categoryid bigint
)

insert into items (id,itemname,categoryid)values('1','ABC-ORANGE','3');
insert into items (id,itemname,categoryid)values('2','DEF-ORANGE','3');
insert into items (id,itemname,categoryid)values('3','AB-Melons','5');
insert into items (id,itemname,categoryid)values('4','MN-onion','8');
insert into items (id,itemname,categoryid)values('5','PQ-potato','9');

我需要帮助来构建查询 (mysql/postgres) 以获得以下 结果

id | itemname    |  Item Group | Category Type  |   Category
---------------------------------------------------------------
1  | ABC-ORANGE  |   Fruits    | Citrus Fruits  |  Oranges
2  | DEF-ORANGE  |   Fruits    | Citrus Fruits  |  Oranges
3  | AB-Melons   |   Fruits    | Melons         |  watermelons
4  | MN-onion    |   vegetables|                |  onion   
5  | PQ-potato   |   vegetables|                |  potato

在结果列Item GroupCategory TypeCategorycategorygroupstable中的三个记录(它会增加),我们将显示类别或上述列中项目的父类别。

例如:- 在上面的结果项中 ABC-ORANGE 分配了一个类别 Oranges 并且这个类别有一个组 Category 。因此在结果类别名称 Oranges 中将显示在 Category 中列和这个类别 ( Oranges ) 有一个父类 ( Citrus Fruits ) 并且这个父级有组 ( Category Type )。所以父类别名称 Citrus Fruits 将显示在 Category Type[=57 中=]列。

使用提供的样本数据,请参阅此处 fiddle 的工作示例。请分享这如何与您的真实数据或其他测试样本一起使用。

架构 (PostgreSQL v11)

查询#1

WITH all_categories AS (
    SELECT
        c.*,
        cg.groupname
    FROM
        categories c
    INNER JOIN
        categorygroups cg ON cg.id = c.categorygroupid
)
SELECT
    i.id,
    i.itemname,
    COALESCE(ig.name,'') as "Item Group",
    COALESCE(ct.name,'') as "Category Type",   
    c.name as "Category"
FROM
    items i
LEFT JOIN
    all_categories c ON i.categoryid = c.id
LEFT JOIN
    all_categories ct ON c.parentid = ct.id  AND
                         ct.groupname = 'Category Type'
LEFT JOIN
    all_categories ig ON (ct.parentid = ig.id or c.parentid=ig.id ) AND
                         ig.groupname = 'Item Group' 
ORDER BY i.id;
id itemname Item Group Category Type Category
1 ABC-ORANGE Fruits Citrus Fruits Oranges
2 DEF-ORANGE Fruits Citrus Fruits Oranges
3 AB-Melons Fruits Melons watermelons
4 MN-onion vegetables onion
5 PQ-potato vegetables potato

View on DB Fiddle