Сортировка элементов в наборе результатов MPTT? - PullRequest
0 голосов
/ 03 октября 2009

Я использую модель MPTT (модифицированный обход дерева предзаказов) для хранения иерархических данных в моей таблице MySQL. (Модель MPTT: другое описание - модель вложенного набора .). У меня такой вопрос: кто-нибудь нашел умный способ сортировки результатов запроса по дереву? Я мог бы просто перейти к метке ORDER BY, но тогда результирующий набор будет отсортирован по метке без учета места или глубины узлов в дереве.

Вот пример запроса, который я использую для получения дерева произвольного узла с глубиной каждого узла:

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 Ответ

0 голосов
/ 28 января 2010

ИМХО, имея дерево MPTT, я всегда сортирую по lft (слева направо). Вот что такое дерево. Если вы сортируете это по любому другому полю, то это не совсем иерархично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...