gpt4 book ai didi

php - 通过postgresql递归列出所有元素

转载 作者:行者123 更新时间:2023-11-29 13:00:44 25 4
gpt4 key购买 nike

在我的数据库中,我基本上有一个名为 person 的表(Doctrine 的实体),它看起来像这样:

class Person
{
private $id;

/**
* @ORM\ManyToOne(targetEntity="Person")
*/
private $parent;
}

我想构建一个方法 getAllChildren,它返回 person1 下的所有人,并递归地返回所有有 child 的人。

我想知道我是否可以通过一个递归 SQL 请求来完成此操作。

UPDATE1

postgres 版本:9.1

  -- Table: person

-- DROP TABLE person;

CREATE TABLE person
(
id serial NOT NULL,
parent_id integer,
nom character varying(255) DEFAULT NULL::character varying,
prenom character varying(255) DEFAULT NULL::character varying,
age integer,
description text,
statut character varying(255) DEFAULT NULL::character varying,
CONSTRAINT person_pkey PRIMARY KEY (id),
CONSTRAINT fk_7cbkzkd63HRzVK8e FOREIGN KEY (parent_id)
REFERENCES person(id) MATCH SIMPLE
)

UPDATE2

我找到了 http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ ,这正是我所需要的除了我的模型是无限的

最佳答案

在 PostgreSQL 中,您可以使用 recursive CTE在表级别优雅地处理递归。对于您的具体问题,解决方案是这样的(根据需要从您的表格中添加其他列;为了简洁和重点,此处省略):

WITH RECURSIVE p(parent, child, refs) AS (
SELECT parent_id, id, 1 FROM person WHERE parent_id IS NOT NULL
UNION
SELECT parent_id, child, refs+1
FROM person JOIN p ON id = parent)
SELECT * FROM p WHERE parent IS NOT NULL
ORDER BY parent, child;

这里的诀窍是,您必须按照自己的方式向上层次结构才能找到更深层次的关系; refs 列表示 parentchild 之间的分隔。 (如果你从任何给定的 person.id 开始向下层次结构,由于递归 CTE 的工作方式,你不能链接超过 1 级,AFAIK。你可能可以,但可能不像上述解决方案那样优雅。)

我发现包含自引用通常很有用,即记录 parent = childrefs = 0。解决方案变为:

  WITH RECURSIVE p(parent, child, refs) AS (
SELECT id, id, 0 FROM person WHERE parent_id IS NOT NULL -- the self-reference
UNION
SELECT parent_id, child, refs+1
FROM person JOIN p ON id = parent)
SELECT * FROM p WHERE parent IS NOT NULL
UNION
SELECT id AS parent, id AS child, 0 AS refs -- add the top-level node
FROM person
WHERE parent_id IS NULL
ORDER BY parent, child;

为了易于使用,您可以将查询包装在一个 View 中,然后您只需在 Doctrine 中创建一个 View 实体来获取数据。

关于php - 通过postgresql递归列出所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30998630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com