Lay*_*yke 3 mysql model adjacency-list hierarchical-data
我想从路径枚举列创建面包屑.
这是我拥有的数据集的示例.
id woeid parent_woeid country_code name language place_type ancestry
祖先是枚举的路径,就像1/23424975/24554868/12602167/12696151布莱顿在英格兰的路径一样.
我希望能够通过查询name专栏来检索面包屑,并让所有的父母.
即.世界,欧洲,英格兰,[县],[镇],[地区],[地方]
([] = a placeholder)
数据永远不会更改,这就是此表使用Adjacency List和路径枚举的原因.
几种可能的方法.我会从你想做的事情,到我建议你做的事情.
不幸的是,枚举的路径祖先(例如,父母)仅对SQL很昂贵且很棘手(参见物化路径查找部分"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)
Run Code Online (Sandbox Code Playgroud)
或者,您可以利用数据的邻接列表方面并使用公用表表达式,或者CONNECT BY取决于数据库(这会忽略ancestry列).有关使用Adjacency List查询祖先的信息,请参阅我关于在RDBMS中表示分层数据的不同方法的问题(请参阅问题末尾的" 数据库特定说明"部分).
您编写的数据不会更改,您想要查询祖先.在这种情况下,嵌套集表示是完美的方法,因为只使用SQL获取所需信息很容易,适用于任何数据库,并且操作非常便宜.下行是移动和插入是昂贵的.在MySQL中管理分层数据可能是我能提供的最佳解释.
嵌套集是我使用的数据,你想做什么,它不会改变.