晚报,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秩序。现在桌子已经按照字母顺序排列,但是当我添加其他地方时,情况就会改变。