Path Enumeration mySQL查询创建面包屑

时间:2011-01-14 23:44:17

标签: mysql model hierarchical-data adjacency-list

我想从路径枚举列创建面包屑。

以下是我拥有的数据集示例。

https://spreadsheets.google.com/ccc?key=0AsGYQbeSAIgFdGRscFpsZFJpQUtfWGIwYWNUY2ktRHc&hl=en_GB&authkey=CPOuuogF

id woeid parent_woeid country_code name language place_type ancestry

祖先是枚举的路径,例如1/23424975/24554868/12602167/12696151是布莱顿在英格兰的路径。

我希望能够通过查询name列来检索面包屑,并让所有父母接受。

即。世界,欧洲,英格兰,[县],[镇],[地区],[地方]

([] = a placeholder)

数据永远不会更改,这就是此表使用Adjacency List和路径枚举的原因。

1 个答案:

答案 0 :(得分:5)

几种可能的方法。我会从你想做的事情,到我建议你做的事情。

物化路径

不幸的是,枚举路径祖先(例如,父母身份)is expensive and tricky to do with SQL only(请参阅物化路径部分"An employee FORD and chain of his supervisors"部分)。如果您有提前路径并且可以使用某种编程语言,那么最简单的方法是使用IN子句:

SELECT *
FROM woe
WHERE ancestry IN (
    '1', 
    '1/23424975', 
    '1/23424975/24554868', 
    '1/23424975/24554868/12602167', 
    '1/23424975/24554868/12602167/12696151'
)
ORDER BY LEN(ancestry)

邻接列表

或者,您可以利用数据的邻接列表方面,并使用公用表表达式或CONNECT BY,而不是取决于数据库(这会忽略ancestry列)。有关使用Adjacency List查询祖先的信息,请参阅我关于representing hierarchical data in an RDBMS的不同方法的问题(请参阅问题末尾的数据库特定说明部分)。

嵌套集

您编写的数据不会更改要查询祖先的。在这种情况下,嵌套集表示是完美的方法,因为只使用SQL获取所需信息很容易,适用于任何数据库,并且操作非常便宜。下行是移动和插入是昂贵的。 Managing Hierarchical Data in MySQL可能是我能提供的最佳解释。

嵌套集是我使用的 给定您的数据,您想要做什么以及它不会改变。