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

2

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

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

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

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

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

<code> 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
</code>

** Edit **

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

Это двухуровневая иерархия или сколь угодно глубокое дерево? Eric J.
@Eric, простая двухуровневая иерархия ack

Ваш Ответ

3   ответа
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]
2
SELECT * FROM `data` ORDER BY COALESCE(`parent`, `id`), `parent`, `id`
Получил это на работу, спасибо за лидерство!ORDER BY COALESCE (IF(parentID, parentTitle, NULL), IF(ID, title, NULL)), parentID, title  - Работает в моем реальном запросе, потому что у меня есть соединение, которое дает мнеparentTitle который я затем могу поменять в КОАЛЕЦЕ при необходимости. ack
Извините, я не заметилtitle требование.
Это кажется хорошим и чистым ... Я не предполагаю, что сортировка поtitle требование может быть включено в предложение ORDER BY, не так ли? ack
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 из запроса.

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

Похожие вопросы