【发布时间】:2010-12-04 11:27:53
【问题描述】:
我如何构建查询,其中父 id 有五个子 id,然后子 id 是父 id 并且有五个子 id。我怎样才能在我们的 query.table 中调用只有一个。请帮助我这种混乱。谢谢 问候 伊玛德巴洛克
【问题讨论】:
-
查看相同问题的回复:stackoverflow.com/a/33699713/5559741
标签: mysql
我如何构建查询,其中父 id 有五个子 id,然后子 id 是父 id 并且有五个子 id。我怎样才能在我们的 query.table 中调用只有一个。请帮助我这种混乱。谢谢 问候 伊玛德巴洛克
【问题讨论】:
标签: mysql
我不知道我说得对不对,但我认为是这样:您希望有一些递归查询来请求具有一些子实体的实体,这些子实体也有子实体(孙实体)。
很遗憾,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
【讨论】:
gce是孩子的孩子。
你可以做一个自我加入来得到一个孩子的孩子。假设像这样的表:
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
【讨论】:
试试下面的查询:
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;
【讨论】: