我有一個表結構如下所示:查詢孩子的名字,並返回父母
locationID locationName parentID
1 Europe 0
2 England 1
3 Kent 2
我查詢按名稱表,因此,如果我搜索肯特。我希望它返回歐洲>英格蘭>肯特作爲搜索結果。
任何人都可以指出我正確的查詢方向。它是同一張桌子上的左連接嗎?
我有一個表結構如下所示:查詢孩子的名字,並返回父母
locationID locationName parentID
1 Europe 0
2 England 1
3 Kent 2
我查詢按名稱表,因此,如果我搜索肯特。我希望它返回歐洲>英格蘭>肯特作爲搜索結果。
任何人都可以指出我正確的查詢方向。它是同一張桌子上的左連接嗎?
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)和一些條件邏輯;實現更多的遞歸方法。
如果層次結構只能走下來,直到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';
如果有更多關卡,該怎麼辦? –
如果有更多關卡,您可以添加更多連接。 –
有多少級別正在檢查?只有三個? – GurV
可能更多,也許6或7 –
您需要一個存儲過程,然後 – GurV