数据库
首页 > 数据库> > 路径枚举mySQL查询以创建面包屑

路径枚举mySQL查询以创建面包屑

作者:互联网

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

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

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

id woeid parent_woeid country_code名称语言place_type祖先

祖先是列举的路径,例如1/23424975/24554868/12602167/12696151是布莱顿在英国的路径.

我希望能够通过查询名称列检索面包屑,并获得所有的父母.

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

([] =占位符)

数据永不改变,这就是为什么该表使用邻接表和路径枚举的原因.

解决方法:

几种可能的方法.我将从您想做的事情,转到我建议您做的事情.

物化路径

不幸的是,枚举的路径祖先(例如,父母身份)为is expensive and tricky to do with SQL only(请参见“物化路径”部分中的“雇员福特及其上级主管链”).如果您提前准备好了路径并且可以使用某种编程语言,那么最简单的方法是使用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”(这将忽略祖先列).有关使用“邻接表”查询祖先的信息,请参阅我关于representing hierarchical data in an RDBMS的不同方式的问题(请参阅问题末尾的“数据库特定说明”部分).

嵌套集

您编写的数据没有更改,并且您想查询祖先.在这种情况下,嵌套集表示形式是一种理想的方法,因为仅使用SQL即可获取所需信息很容易,可与任何数据库一起使用,并且操作非常便宜.缺点是移动,插入昂贵.我可以提供Managing Hierarchical Data in MySQL的最佳解释,以说明其工作原理.

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

标签:adjacency-list,hierarchical-data,mysql,model
来源: https://codeday.me/bug/20191023/1914136.html