几种可能的方法。我会从你想做的事,到我建议你做的事。
物化路径
不幸的是,仅使用 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 中管理分层数据可能是我能提供的关于它如何工作的最佳解释。
鉴于您的数据,您想要做的事情并且它不会改变,我会使用嵌套集。