У меня есть древовидная структура в таблице, и она использует материализованные пути, чтобы я мог быстро найти детей. Тем не менее, мне также нужно сначала отсортировать результаты по глубине, как можно было бы ожидать с ответами на потоковый форум.
id | parent_id | matpath | created
----+-----------+---------+----------------------------
2 | 1 | 1 | 2010-05-08 15:18:37.987544
3 | 1 | 1 | 2010-05-08 17:38:14.125377
4 | 1 | 1 | 2010-05-08 17:38:57.26743
5 | 1 | 1 | 2010-05-08 17:43:28.211708
7 | 1 | 1 | 2010-05-08 18:18:11.849735
6 | 2 | 1.2 | 2010-05-08 17:50:43.288759
9 | 5 | 1.5 | 2010-05-09 14:02:43.818646
8 | 6 | 1.2.6 | 2010-05-09 14:01:17.632695
Итак, окончательные результаты должны быть отсортированы следующим образом:
id | parent_id | matpath | created
----+-----------+---------+----------------------------
2 | 1 | 1 | 2010-05-08 15:18:37.987544
6 | 2 | 1.2 | 2010-05-08 17:50:43.288759
8 | 6 | 1.2.6 | 2010-05-09 14:01:17.632695
3 | 1 | 1 | 2010-05-08 17:38:14.125377
4 | 1 | 1 | 2010-05-08 17:38:57.26743
5 | 1 | 1 | 2010-05-08 17:43:28.211708
9 | 5 | 1.5 | 2010-05-09 14:02:43.818646
7 | 1 | 1 | 2010-05-08 18:18:11.849735
Как мне это решить? Могу ли я сделать это в прямом SQL (это PostgreSQL 8.4) или добавить дополнительную информацию в эту таблицу?
Обновление: попытка лучше объяснить критерии сортировки.
Представьте, что id '1' является корневым сообщением на форуме, а все с "matpath", начинающимся с "1", является дочерним элементом этого сообщения. Таким образом, идентификаторы с 2 по 5 являются прямыми ответами на 1 и получают матпаты "1". Тем не менее, id 6 - это ответ 2, а не непосредственно на 1, поэтому он получает матовую форму 1.2. Это означает, что для многопоточного форума с надлежащим вложением, со всеми идентификаторами, показанными в таблицах, структура форума будет выглядеть так, следовательно, требование упорядочения:
* id 1 (root post)
* id 2
* id 6
* id 8
* id 3
* id 4
* id 5
* id 9
* id 7