2016-02-14 73 views
0

簡化示例:SQL:按外鍵編號排序

我有一個名爲things的SQL表。事情本身有一個id和一個name。事物是樹的一部分,例如一個事物可以有一個父母;到底如何存儲並不重要,然而重要的是可以從根節點到當前事物獲得事物id的列表。

我有另一張表,名爲properties。屬性有thing_id列,name列和value列。

我現在想爲目前的事情獲取所有屬性,按照thing_id排序的,按從根目錄到當前目錄的路徑的順序

例如,如果當前的事情嵌套這樣的:Root(1) > Vehicle(4) > Car(2) > Hybrid(3),我希望的屬性列表與具有首先thing_id==1屬性返回,接着是那些與thing_id == 4,然後thing_id==2最後thing_id==3

這怎麼用SQL來完成? (不使用N + 1選擇)

+0

我使用的是Rails,我想要一個解決方案,至少可以在SQLite和MySQL2上工作。 – Qqwy

回答

1

在SQL中,這可以通過使用遞歸查詢來實現。這裏是一個例子

DECLARE @item as varchar(10) 

with CTE (main_part, sub_part, NestingLevel) 
as  
( 
       select main_part, sub_part, 1 from tblParts 
         where main_part = @item 

       union all 

       select tblParts.main_part, tblParts.sub_part, (NestingLevel + 1) from tblParts 
       inner join CTE on tblParts.main_part = CTE.sub_part 
) 

select * from CTE 

爲了在MySQL中解決這個問題,你可以嘗試臨時表方法。這裏有一個很好的例子:How to do the Recursive SELECT query in MySQL?

+0

現在在MySQL中工作嗎? –

+0

@JoachimIsaksson,我沒有嘗試過MySQL,但是由於MS SQL和MySQL都是RDBMS,我認爲這種方法對於MySQL也是可行的。 – IgorM

+0

[似乎還沒有實施](https://bugs.mysql.com/bug.php?id=16244)。 –