查询以列方式列出带有类别组的分层类别的所有父级
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 Group
,Category Type
和Category
是categorygroups
table中的三个记录(它会增加),我们将显示类别或上述列中项目的父类别。
例如:- 在上面的结果项中 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
我有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 Group
,Category Type
和Category
是categorygroups
table中的三个记录(它会增加),我们将显示类别或上述列中项目的父类别。
例如:- 在上面的结果项中 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 |