繁体   English   中英

使用mysql的父子关系

[英]Parent child relation using mysql

我有一个名为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

可以通过

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

如果您担心此查询的性能,则可以在单词“ 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 Explain上的链接:

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 

如果您解释该查询,它将显示比以前更好的性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM