我想从路径枚举列创建面包屑。
以下是我拥有的数据集示例。
id
woeid
parent_woeid
country_code
name
language
place_type
ancestry
祖先是枚举的路径,例如1/23424975/24554868/12602167/12696151
是布莱顿在英格兰的路径。
我希望能够通过查询name
列来检索面包屑,并让所有父母接受。
即。世界,欧洲,英格兰,[县],[镇],[地区],[地方]
([] = a placeholder)
数据永远不会更改,这就是此表使用Adjacency List和路径枚举的原因。
答案 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可能是我能提供的最佳解释。
嵌套集是我使用的 给定您的数据,您想要做什么以及它不会改变。