对从 RECURSIVE 查询中检索到的记录进行分组,这些记录具有相同的 parents、grandparents
Group retrieved records from a RECURSIVE query, that have the same parents, grandparents
我有一个 table 与项目的关系,而不是与类别的多对多关系。
项目
id | name
1 name1
2 name2
3 name3
项目类别
id | category_id | item_id
1 4 1
2 5 1
3 7 1
4 8 1
类别(parent_id 自身的外键)
id | parent_id | name
1 Null A1
2 1 B1
3 1 B2
4 2 C1
5 3 C2
6 1 D1
7 6 DE
8 1 DT
我正在尝试获取项目的项目类别,从 child 到 parent,因此我使用:
WITH RECURSIVE descendants(name, id, slug, parent_id, bread_order) AS (
SELECT name, id, slug, parent_id, 0
FROM categories
where id in (
SELECT c.id FROM items AS p
INNER JOIN items_categories AS pc ON p.id=pc.item_id
INNER JOIN categories AS c ON pc.category_id = c.id
WHERE p.id = 10
)
UNION ALL
SELECT c2.name, c2.id, c2.slug, c2.parent_id, bread_order+1
FROM categories AS c2
INNER JOIN descendants AS d ON c2.id=d.parent_id
) SELECT id, name, parent_id, bread_order FROM descendants
ORDER by bread_order DESC
问题是两个 child 类别可以有相同的 parent,或者一个 parent 对另一个是大 parent。
C1 -> B1 -> A1
C2 ->B1 -> A1
C3 ->B2 -> A1
DE -> D1 -> A1
DT -> A1
我试图将它们分组但是,因为有相同的 parents,grand_parents 不是我需要的,当我从数据库中检索信息时我需要知道如何制作路径(见上文)。
有什么办法吗,比如使用 CASE 和来自子查询的 returns 的 ID?
查询时可以聚合路径:
WITH RECURSIVE descendants(name, id, parent_id, bread_order, path) AS (
SELECT name, id, parent_id, 0, array[id] as path
FROM categories
where id in (SELECT c.id
FROM items AS p
JOIN items_categories AS pc ON p.id=pc.item_id
JOIN categories AS c ON pc.category_id = c.id
WHERE p.id = 1)
UNION ALL
SELECT c2.name, c2.id, c2.parent_id, bread_order+1, d.path||c2.id
FROM categories AS c2
JOIN descendants AS d ON c2.id=d.parent_id
)
SELECT id, name, parent_id, path, bread_order
FROM descendants
ORDER by path
我有一个 table 与项目的关系,而不是与类别的多对多关系。
项目
id | name
1 name1
2 name2
3 name3
项目类别
id | category_id | item_id
1 4 1
2 5 1
3 7 1
4 8 1
类别(parent_id 自身的外键)
id | parent_id | name
1 Null A1
2 1 B1
3 1 B2
4 2 C1
5 3 C2
6 1 D1
7 6 DE
8 1 DT
我正在尝试获取项目的项目类别,从 child 到 parent,因此我使用:
WITH RECURSIVE descendants(name, id, slug, parent_id, bread_order) AS (
SELECT name, id, slug, parent_id, 0
FROM categories
where id in (
SELECT c.id FROM items AS p
INNER JOIN items_categories AS pc ON p.id=pc.item_id
INNER JOIN categories AS c ON pc.category_id = c.id
WHERE p.id = 10
)
UNION ALL
SELECT c2.name, c2.id, c2.slug, c2.parent_id, bread_order+1
FROM categories AS c2
INNER JOIN descendants AS d ON c2.id=d.parent_id
) SELECT id, name, parent_id, bread_order FROM descendants
ORDER by bread_order DESC
问题是两个 child 类别可以有相同的 parent,或者一个 parent 对另一个是大 parent。
C1 -> B1 -> A1
C2 ->B1 -> A1
C3 ->B2 -> A1
DE -> D1 -> A1
DT -> A1
我试图将它们分组但是,因为有相同的 parents,grand_parents 不是我需要的,当我从数据库中检索信息时我需要知道如何制作路径(见上文)。
有什么办法吗,比如使用 CASE 和来自子查询的 returns 的 ID?
查询时可以聚合路径:
WITH RECURSIVE descendants(name, id, parent_id, bread_order, path) AS (
SELECT name, id, parent_id, 0, array[id] as path
FROM categories
where id in (SELECT c.id
FROM items AS p
JOIN items_categories AS pc ON p.id=pc.item_id
JOIN categories AS c ON pc.category_id = c.id
WHERE p.id = 1)
UNION ALL
SELECT c2.name, c2.id, c2.parent_id, bread_order+1, d.path||c2.id
FROM categories AS c2
JOIN descendants AS d ON c2.id=d.parent_id
)
SELECT id, name, parent_id, path, bread_order
FROM descendants
ORDER by path