使用mysql的父子关系

时间:2015-03-04 10:26:54

标签: mysql join parent-child

我有一个名为relation的示例mysql表,如下所示:

ID  TypeID  Name         Parent_ID
----------------------------------
1    1      Parent        0
2    2      Child1        1
3    2      Child2        1
4    3      GrandChild1   2
5    3      GrandChild2   2
6    3      GrandChild3   2
7    3      GrandChild4   3
8    3      GrandChild5   3

如何使用mysql查询生成如下所示的报告。

ParentName  ChildName   GrandChildName
--------------------------------------
Parent      Child1      GrandChild1
Parent      Child1      GrandChild2
Parent      Child1      GrandChild3
Parent      Child2      GrandChild4
Parent      Child2      GrandChild5

2 个答案:

答案 0 :(得分:1)

可以通过

来实现
select rl.Name as 'ParentName', rl1.Name as 'ChildName',rl2.Name as 'GrandChildName'  from relation rl
INNER JOIN (select * from relation where TypeID=2) rl1 ON rl.ID=rl1.Parent_ID
INNER JOIN (select * from relation where TypeID=3) rl2 ON rl1.ID=rl2.Parent_ID

我想知道其他任何方法。

编辑:以下是我发现的另一种没有内部查询的方法,如下所示,这是我真正想要实现的。

select rl.Name as 'ParentName', rl1.Name as 'ChildName',rl2.Name as 'GrandChildName'  from relation rl
INNER JOIN relation rl1 ON rl.ID=rl1.Parent_ID and rl1.TypeID=2
INNER JOIN relation rl2 ON rl1.ID=rl2.Parent_ID and rl2.TypeID=3

答案 1 :(得分:1)

如果您担心此查询的性能,那么您可以检查在“EXPLAIN”一词之前运行上述查询的性能。

    EXPLAIN select 
      rl.Name as 'ParentName', 
      rl1.Name as 'ChildName',
      rl2.Name as 'GrandChildName'  from relation rl
    INNER JOIN (select * from relation where TypeID=2) rl1 ON rl.ID=rl1.Parent_ID
    INNER JOIN (select * from relation where TypeID=3) rl2 ON rl1.ID=rl2.Parent_ID

如果您发现性能不太好,那么您可以在TypeID上创建索引。

这是关于mysql说明的链接:

http://www.sitepoint.com/using-explain-to-write-better-mysql-queries/

CREATE INDEX Idx_TypeID relation(TypeID);

并按以下方式更改上述查询:

select rl.Name as 'ParentName', rl1.Name as 'ChildName',rl2.Name as 'GrandChildName'  
from relation rl
INNER JOIN (select * from relation where TypeID=2) rl1 ON rl.ID=rl1.Parent_ID
INNER JOIN (select * from relation where TypeID=3) rl2 ON rl1.ID=rl2.Parent_ID
WHERE rl.TypeID=1

注意:我在最后一行添加了一个where子句,以便使用刚刚创建的索引(Idx_TypeID)。 (表现越来越好。)

现在在单词“EXPLAIN”之前再次检查此查询。这次你将获得更好的解释输出。美好的一天!

编辑:

可以避免子查询。感谢 mpsbhat ,指出了我之前错过的一个重点。 所以这是我直接引用mpsbhat帖子的查询:

SELECT
  rl. NAME AS 'ParentName',
  rl1. NAME AS 'ChildName',
  rl2. NAME AS 'GrandChildName'
FROM
  relation rl
INNER JOIN relation rl1 ON rl.ID = rl1.Parent_ID
AND rl1.TypeID = 2
INNER JOIN relation rl2 ON rl1.ID = rl2.Parent_ID
AND rl2.TypeID = 3

如果您解释该查询,则表明其性能优于前一个。