晚上,
我有一个嵌套的设置表,其中包含大约 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 顺序的同时按字母顺序将其取出。现在表格已经按字母顺序排列,但是当我添加其他地方时,情况会改变。