晚報,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秩序。現在桌子已經按照字母順序排列,但是當我添加其他地方時,情況就會改變。