1

我正在使用MPTT(修改的预序树遍历)模型将分层数据存储在我的 MySQL 表中。(MPTT 模型:另一种描述是嵌套集模型。)。我的问题是:有没有人想出一种聪明的方法来对树上的查询结果进行排序?我可以只使用“按标签排序”,但结果集将按标签排序,而不考虑节点在树中的位置或深度。

这是我用来检索任意节点的树的查询示例,每个节点的深度:

SELECT node.id, (COUNT(parent.id) - (sub_tree.depth + 1)) AS depth
FROM person AS node,
person AS parent,
person AS sub_parent, (
    SELECT node.id, (COUNT(parent.id) - 1) AS depth
    FROM person AS node,
    person AS parent
    WHERE node.lft BETWEEN parent.lft AND parent.rgt
    AND node.id = 1 // that's my root object
    GROUP BY node.id, node.lft
    ORDER BY node.lft
) AS sub_tree
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
AND sub_parent.id = sub_tree.id 
GROUP BY node.id
ORDER BY node.lft

根据http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

当然,这总是按项目在嵌套集中的位置排序。如果我想通过“lastName”或“accountBalance”或“town”来订购它们怎么办?这可以在 MySQL 中完成,还是你们认为我必须求助于我的脚本语言对结果进行排序?

4

1 回答 1

1

恕我直言,我总是按 lft(从左到右)排序 MPTT 树。这就是树的全部意义所在。如果您按任何其他字段对其进行排序,那么它并不是真正的层次结构。

于 2010-01-27T21:00:38.703 回答