1

晚上,

我有一个嵌套的设置表,其中包含大约 14,000 个位置:

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)。类型列有效地告诉您深度。

城市 = 0

钴 = 1

AP、EP、Ch 或 Unk = 2

但是,稍后我将添加更多具有不同深度的国家,例如美国:

城市 = 0

圣 = 1

钴 = 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 顺序的同时按字母顺序将其取出。现在表格已经按字母顺序排列,但是当我添加其他地方时,情况会改变。

4

1 回答 1

1

我认为嵌套集是不可能的。信息不够。也许您可以通过空间索引或四叉树获得更好的运气。当您有一个四键并且想要查询英格兰的所有县时,您可以在四键中从左到右搜索所有缩放级别。因此,您可以通过仅查询 2 个缩放级别来查询 2 个深度。但通常你会从一个分支获得所有级别。我不确定您是否可以按字典顺序对结果进行排序,但是使用空间索引可以将 4 个方向添加到索引中。这是一篇关于碰撞检测和四叉树的博客:lab.polygonal.de/?p=202。

于 2012-05-27T07:07:19.540 回答