我们如何编写mysql查询,其中父ID具有子ID,下次子ID是父ID我该怎么办?

时间:2010-12-04 11:27:53

标签: mysql

我如何构建查询,其中父ID具有五个子ID,并且在该子id之后是父ID并且具有五个子id。我可以在我们的query.table中调用只有一个。请帮助我这种困惑。谢谢 问候 imadbaloch

3 个答案:

答案 0 :(得分:2)

我不知道我是否认为你是对的,但我想是这样的:你想要一些递归查询来询问一个带有一些子实体的实体,这些实体也有子实体(孙子实体) )。

不幸的是, MySQL在查询中不支持递归

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

更新:如果深度是固定的,比如说,您对直接子实体和孙子实体感兴趣(并且不再感兴趣),那么您可以执行两个连接,例如:

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

答案 1 :(得分:0)

你可以自我加入以获得孩子的孩子。假设有一个表:

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

缺点是,对于您想要包含的每个层次结构,您需要另一个连接。

<强>更新

回应评论。

这不是每个父母的一个孙子。如果父母有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

答案 2 :(得分:0)

尝试以下查询:

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;