2012-05-26 27 views
1

晚報,MySQL的嵌套組地理樹

我有一組嵌套表中它大約14000場所作爲這樣的:

placeId  name  type  lft  rgt 
1    England  Cty   1   22878 
2    Bedfords. Co   2   259 
3    Ampthill AP   3   4 

我有三個國家(CTY),88個縣(Co)和每個縣都有兒童定居點(AP,EP,Ch和Unk)。類型欄有效地告訴你深度。

CTY = 0

CO = 1

AP,EP,CH或UNK = 2

然而,在稍後的日期,我要補充的是具有不同的深度進一步的國家,例如美國:

CTY = 0

ST = 1

CO = 2

鎮/市= 3

我想是會拉我出去查詢所有兄弟節點和所有子節點取決於被在網站上看到什麼地方的深度爲1。

所以如果正在觀看英格蘭我想:

England 
**Bedfordshire 
**Berkshire 
**Buckinghamshire 
***More Counties* 
Scotland 
Wales 

如果貝德福德選擇我想:

England 
**Bedfordshire 
****Ampthill 
****Arlesey 
****Aspley Guise 
*****More Towns* 
**Berkshire 
**Buckinghamshire 
***More Counties* 
Scotland 
Wales 

雖然我開始構建正在接管30查詢幾秒鐘,不要做我想做的一切,所以毫無意義。

我可以通過運行在大約100毫秒每個深度的查詢得到我想要的結果,但如果可能的話我寧願一個單一的查詢和最小的PHP使用。

任何想法?

在此先感謝。

這是我能想出的最好:

(
SELECT parent.name, parent.lft, parent.rgt, 
(
CASE 
WHEN parent.type = 'Co' THEN 1 
WHEN parent.type IN('AP', 'EP', 'Ch','Unk') THEN 2 
END 
) AS depth 
FROM places AS node, places AS parent 
WHERE (parent.lft BETWEEN node.lft AND node.rgt AND (node.placeId IN(1, 7553)) AND (parent.lft BETWEEN node.lft AND node.rgt)) 
ORDER BY parent.name 
) 
UNION 
(
SELECT name, lft, rgt, 0 AS depth FROM places WHERE type = 'Cty' 
) 
ORDER BY lft 

唯一的問題是我不能把它弄出來的字母順序,同時保持LFT-RGT秩序。現在桌子已經按照字母順序排列,但是當我添加其他地方時,情況就會改變。

回答

1

我不認爲這是可能的一組嵌套。這是不夠的信息。也許你可以用空間索引或四叉樹來獲得更好的運氣。當你有一個quadkey,你想查詢從英國,你可以搜索從左邊到右邊開始在quadkey縮放級別所有的縣。因此,您只能通過查詢2縮放級別查詢2個深度。但通常你會得到一個分支的所有級別。我不知道你是否可以排序的結果詞典但空間索引可以4個方向添加到索引。這是一個關於colision檢測和四叉樹博客:lab.polygonal.de/?p=202。