我有一个名为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
答案 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
如果您解释该查询,则表明其性能优于前一个。