Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 组从递归查询中检索到的记录,这些记录具有相同的父级、祖级和父级_Postgresql_Postgresql 10 - Fatal编程技术网

Postgresql 组从递归查询中检索到的记录,这些记录具有相同的父级、祖级和父级

Postgresql 组从递归查询中检索到的记录,这些记录具有相同的父级、祖级和父级,postgresql,postgresql-10,Postgresql,Postgresql 10,我有一个表,表中的项比与类别的关系要多 项目 项目类别 id | category_id | item_id 1 4 1 2 5 1 3 7 1 4 8 1 类别(父项id自身的外键) 我试图从子项到父项获取项目类别,因此我使用: WITH RECURSIVE descendants(name, id, slug, parent_id, bread_orde

我有一个表,表中的项比与类别的关系要多

项目

项目类别

id | category_id | item_id
  1     4            1
  2     5            1
  3     7            1
  4     8            1
类别(父项id自身的外键)

我试图从子项到父项获取项目类别,因此我使用:

 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
问题是两个子类别可以有相同的父类别,或者一个类别的父类别是另一个类别的父类别

C1 -> B1 -> A1
C2 ->B1  -> A1
C3 ->B2  -> A1
DE -> D1 -> A1
DT  -> A1
我尝试将它们分组,但是,因为有相同的父母,grand_父母不是我需要的,当我从数据库检索信息时,我需要知道如何创建路径(见上文)


是否有任何方法,比如将CASE与子查询返回的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

可以,使用路径唯一的问题是正确的路径位于顶部父级,而不是起始子级
C1 -> B1 -> A1
C2 ->B1  -> A1
C3 ->B2  -> A1
DE -> D1 -> A1
DT  -> A1
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