2015-09-20 1 views
0

У меня есть таблица с некоторыми иерархическими данными. Я обработал его в иерархическом порядке путем вычисления пути с помощью триггера, но теперь я хочу сортировать их с другим параметром. Посмотрите на эти фотографии:Как заказать иерархическую таблицу по двум параметрам в MySQL?

Это таблица с иерархическими данными обязала Путь:

enter image description here

я ожидать, что эти две строки подкачки, так как ряд ID = 4 имеет дату перед Роу ID = 2:

enter image description here

Так как я могу заказать каждый уровень по столбцу?

ПРИМЕЧАНИЕ: ID - это случайный номер, созданный с помощью ТРИГГЕРА.

ответ

1

Вы можете использовать FIND_IN_SET, чтобы извлечь уровень иерархии каждой строки. Затем используйте это в пункте ORDER BY:

SELECT ID, Name, ParentId, Date, Path 
FROM mytable 
ORDER BY FIND_IN_SET(ID, REPLACE(Path, '.', ',')), Date 

Примечание: Мы должны использовать REPLACE функцию, чтобы заменить '.' символы с ',' так что FIND_IN_SET работ, как ожидалось.

Demo here

В качестве альтернативы вы можете изменить ваш триггер так, чтобы сформировать дополнительное поле «уровень» и использовать это поле в пункте вашего запроса ORDER BY.

+0

Life Saving Solution. Можете ли вы объяснить часть «FIND_IN_SET»? Как это решило проблему? –

+0

спасибо, что это хорошее решение. поэтому еще один вопрос. каков эффект индекса первого появления идентификатора в пути? –

+0

Чтобы понять это, лучше включить 'FIND_IN_SET (ID, REPLACE (Path, '.',', ')) 'в разделе' SELECT' вашего запроса, чтобы увидеть число, которое оно возвращает для каждой строки. –

0

Думаю, вам нужно добавить дату в столбце пути на каждом уровне, поскольку вы не можете просто упорядочить по дате.

Так путь-столбец должен выглядеть следующим образом:

0.date-2015-12-09 22: 15: 12.parent1.date-2015-12-09 22: 15: 14.parent4

0.date-2015-12-09 22: 15: 12.parent1.date-2015-12-09 22: 15: 17.parent2

В этом случае, дата superceeds родительского уровня. В этой ситуации 1.4 предстанет перед 1.2, потому что 1,4 случилось до того 1.2

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

ли я это на этот раз? :-) Надеюсь, что смогу помочь :-)

+0

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

+0

ahh ok wait .. Я должен был быстро, позвольте мне заглянуть в то, что –

+0

действительно сложное решение. звучит как рабочий. позвольте мне проверить его –