2

Вопрос по mysql – сортировка по иерархии MySQL

У меня есть схема, которая по сути выглядит так:

CREATE TABLE `data` (
  `id` int(10) unsigned NOT NULL,
  `title` text,
  `type` tinyint(4),
  `parent` int(10)
)

type Поле - это просто перечисление, где 1 - родительский тип, а 2 - дочерний тип (в действительности существует много типов, где некоторые должны вести себя как родители, а другие - как дети).parent поле указывает, что запись является дочерней по отношению к другой записи.

Я знаю, что это, вероятно, не идеально для запроса, который я хочу построить, но это то, с чем мне нужно работать.

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

 ID | title       |type |parent 
--------------------------------
 4  | ParentA     | 1   |
 2  | ChildA      | 2   | 4
 5  | ChildB      | 2   | 4
 7  | ParentB     | 1   |
 9  | ChildC      | 2   | 7
 1  | ChildD      | 2   | 7

** Edit **

Мы должны быть в состоянии взятьtype поле из картины полностью. Еслиparent не является нулевым, тогда он должен быть сгруппирован под его родителем.

  • Выполнение конкатенации строк и сортировка по этому результату довольно неэффективны.

    от
  • @Eric, простая двухуровневая иерархия

    от ack
  • Извините, я не заметилtitle требование.

    от
  • Получил это на работу, спасибо за лидерство!ORDER BY COALESCE (IF(parentID, parentTitle, NULL), IF(ID, title, NULL)), parentID, title  - Работает в моем реальном запросе, потому что у меня есть соединение, которое дает мнеparentTitle который я затем могу поменять в КОАЛЕЦЕ при необходимости.

    от ack
  • Это кажется хорошим и чистым ... Я не предполагаю, что сортировка поtitle требование может быть включено в предложение ORDER BY, не так ли?

    от ack
  • Это двухуровневая иерархия или сколь угодно глубокое дерево?

    от Eric J.
  • 2

    Code:

    SELECT * FROM `data` ORDER BY COALESCE(`parent`, `id`), `parent`, `id`
    

  • 0

    Вы сказали, что хотите отсортировать заголовки, верно?

    SELECT id, title, parent
    FROM
      ( SELECT id, title, parent,
        CASE WHEN parent is null THEN title ELSE CONCAT((SELECT title FROM `data` d2 WHERE d2.id = d.parent), '.', d.title) END AS sortkey
        FROM `data` d
       ) subtable
    ORDER BY sortkey
    

    редактировать: отредактировано, чтобы удалитьtype из запроса.

  • 0

    Вот решение

    протестированное для работы на SQL Server. Должно быть по сути то же самое на MySQL

    select Id, Title, [Type], Id as OrderId from Hier h1 where [Type] = 1
    union
    select Id, Title, [Type], Parent as OrderId from Hier h2 where [Type] = 2
    order by OrderId, [Type]