2012-05-26 28 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。