[英]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.