簡體   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