3

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

这是我拥有的数据集的示例。

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列来检索面包屑,并获得所有的父母。

IE。World, Europe, England, [County], [Town], [Region], [Place]

([] = a placeholder)

数据永远不会改变,这就是该表使用邻接列表和路径枚举的原因。

4

1 回答 1

5

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

物化路径

不幸的是,仅使用 SQL 枚举路径祖先(例如父系)是昂贵且棘手的(请参阅Materialized Path find部分"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列)。有关使用邻接列表查询祖先的信息,请参阅我关于在 RDBMS 中表示分层数据的不同方式的问题(请参阅问题末尾的数据库特定说明部分)。

嵌套集

你写你的数据没有改变你想查询祖先。在这种情况下,嵌套集表示是完美的方法,因为仅使用 SQL 获取您想要的信息很容易,适用于任何数据库,并且操作非常便宜。缺点是移动和插入很昂贵。在 MySQL 中管理分层数据可能是我能提供的关于它如何工作的最佳解释。

鉴于您的数据,您想要做的事情并且它不会改变,我会使用嵌套集。

于 2011-01-15T21:03:47.893 回答