【问题标题】:how can we write mysql query where parent id have a child id and next time child id is a parent id how can i do?我们如何编写 mysql 查询,其中父 id 有一个子 id,下一次子 id 是父 id 我该怎么办?
【发布时间】:2010-12-04 11:27:53
【问题描述】:

我如何构建查询,其中父 id 有五个子 id,然后子 id 是父 id 并且有五个子 id。我怎样才能在我们的 query.table 中调用只有一个。请帮助我这种混乱。谢谢 问候 伊玛德巴洛克

【问题讨论】:

标签: mysql


【解决方案1】:

我不知道我说得对不对,但我认为是这样:您希望有一些递归查询来请求具有一些子实体的实体,这些子实体也有子实体(孙实体)。

很遗憾,MySQL 不支持查询中的递归

您必须手动使用多个查询来询问子实体的子实体(孙实体)及其子实体(孙实体)等等。

更新:如果深度是固定的,例如,您对直接子实体和孙实体感兴趣(仅此而已),那么您可以执行两个连接,例如:

SELECT e.id, e.name, ce.id, ce.name, gce.id, gce.name
FROM <table> AS e
LEFT JOIN <table> AS ce ON ce.parent_id = e.id
LEFT JOIN <table> AS gce ON gce.parent_id = ce.id

【讨论】:

  • 您可以使用 JOIN 模拟递归
  • 因此,您需要知道递归的深度,因此不可能是动态的。如果只需要子实体和孙实体,那么您是对的,您可以只使用联接。但是,如果出现所有子实体和孙子实体都可能有自己的子实体(以及孙子和孙子实体等)需要确定的情况,...
  • 这个查询只显示父母和他的孩子,但我想显示孩子的孩子和完整的细节
  • gce孩子的孩子。
【解决方案2】:

你可以做一个自我加入来得到一个孩子的孩子。假设像这样的表:

Id    ChildId    ....
----- ------- -----
....

类似:

SELECT a.Id as EntryId, a.ChildId as ChildId, b.ChildId as GrandchildId
FROM <tablename> a INNER JOIN <tablename> b ON a.ChildId = b.Id

缺点是,对于要包含的每个层次结构级别,都需要另一个联接。

更新

响应 cmets。

这不是每个父母一个孙子。如果父级有 5 个子级,并且每个子级有 4 个子级,那么您将总共返回 20 行。

要获得孙辈的完整详细信息,您需要再次自行加入,如下所示:

SELECT a.Id as EntryId, a.ChildId as ChildId, b.ChildId as GrandchildId, c.*
FROM (<tablename> a INNER JOIN <tablename> b ON a.ChildId = b.Id)
    INNER JOIN <tablename> c ON b.ChildId = c.Id

【讨论】:

  • 因此,每个实体只能有一个子实体。那不是等级制度。在层次结构中,一个实体可以有 0 到 n 个子实体并有一个父实体(除非它是顶级实体)。
  • 这个查询只显示父母和他的孩子,但我想显示孩子的孩子和完整的细节
【解决方案3】:

试试下面的查询:

DECLARE @id INT
SET @id = 5 

CREATE TABLE #temp (id INT , ParentId INT)

INSERT INTO #temp VALUES(1,0);

INSERT INTO #temp VALUES(2,1);

INSERT INTO #temp VALUES(3,2);

INSERT INTO #temp VALUES(4, 3);

INSERT INTO #temp VALUES(5,4);

WITH parent AS
(
   SELECT id, parentId  from #temp WHERE id = @id
   UNION ALL 
   SELECT t.id, t.parentId FROM parent
   INNER JOIN #temp t ON t.id =  parent.parentid
)

SELECT id,ParentId FROM parent
WHERE id <> @id;    

Drop TABLE #temp;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多