2017-02-13 67 views
-1

我有一個表結構如下所示:查詢孩子的名字,並返回父母

locationID  locationName parentID 
    1   Europe   0 
    2   England   1 
    3    Kent   2 

我查詢按名稱表,因此,如果我搜索肯特。我希望它返回歐洲>英格蘭>肯特作爲搜索結果。

任何人都可以指出我正確的查詢方向。它是同一張桌子上的左連接嗎?

+0

有多少級別正在檢查?只有三個? – GurV

+0

可能更多,也許6或7 –

+0

您需要一個存儲過程,然後 – GurV

回答

0

MySQL不提供遞歸查詢的原生支持。

對於在層次結構中設置「最大」數量的層次,可以編寫查詢。

作爲一個例子:

SELECT g0.locationName 
     , g1.locationName 
     , g2.locationName 
     , g3.locationName 
     , g4.locationName 
     , g5.locationName 
     , g6.locationName 
    FROM mytable g0 
    LEFT JOIN mytable g1 ON g1.locationId = g0.parentId 
    LEFT JOIN mytable g2 ON g2.locationId = g1.parentId 
    LEFT JOIN mytable g3 ON g3.locationId = g2.parentId 
    LEFT JOIN mytable g4 ON g4.locationId = g3.parentId 
    LEFT JOIN mytable g5 ON g5.locationId = g4.parentId 
    LEFT JOIN mytable g6 ON g6.locationId = g5.parentId 
    WHERE g0.locationName = 'Kent' 

這種方法可以擴展到的水平,G7,G8,G9的更大的數字。但是查詢會強制執行最大數量的遍歷。

該查詢不會對「循環」執行任何檢查。例如,如果「Europe」具有引用「Kent」的parentId,那將是層次結構中的循環。查詢並沒有做任何事情來檢查這種情況,它只是跟着父母的鏈接,並且周圍和周圍的事情都會發生。

爲了允許動態數量的級別,爲了使它在MySQL中工作,需要一個MySQL存儲程序(PROCEDURE)和一些條件邏輯;實現更多的遞歸方法。

0

如果層次結構只能走下來,直到3個層次則是,你可以使用self join獲得所需要的數據,例如:

SELECT l3.locationName, l2.locationName, l1.locationName 
FROM location l1 JOIN location l2 ON l1.locationID = l2.parentId 
JOIN location l3 ON l2.locationID = l3.parentID 
WHERE l3.locationName = 'Kent'; 
+0

如果有更多關卡,該怎麼辦? –

+0

如果有更多關卡,您可以添加更多連接。 –