Сортировка элементов в наборе результатов MPTT?
Я использую модель MPTT (модифицированный обход дерева предзаказа) для хранения иерархических данных в моей таблице MySQL. (Модель MPTT: другое описание - модель вложенного множества.). У меня такой вопрос: кто-нибудь нашел умный способ сортировки результатов запроса по дереву? Я мог бы просто пойти "ORDER BY label", но тогда результирующий набор будет отсортирован по метке без учета места или глубины узлов в дереве.
Вот пример запроса, который я использую, чтобы получить дерево произвольного узла с глубиной каждого узла:
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, или вы думаете, что мне придется прибегнуть к сортировке результатов на моем языке сценариев?
1 ответ
ИМХО, имея дерево MPTT, я всегда сортирую по lft (слева направо). Вот что такое дерево. Если вы сортируете это по любому другому полю, то это не совсем иерархично.