nurbek Дело не в способе вывода, а в способе хранения. Если данные хранятся в неудачной форме, нормального вывода все равно не придумать. В качестве интересного способа хранения могу предложить Nested Sets.
nurbek, 3 способа, которые мне по душе: 1) хранить в БД только id родителя и при выборе предков или построении дерева уходить в рекурсию в PHP; 2) хранить в БД только УРИ (вроде parent/children). Удобно по like выбирать предков да и сортировать + строить дерево чень просто; 3) хранить в БД id родителя и уровень. При записи в БД пускать рекурсию и записывать/перезаписывать уовень. Ну, и при каждом выводе рекурсия не нужна, достаточно order by уровень. 1) Метод самый кошерный, имхо. Где есть глюки и тормоза, там есть и кэширование. 2) Самый простой и удобный, но УРИ должны быть жёсткие и выступать в роли альтернативы id. Это мне кажется неправильным. 3) Если в первом методе глюки и тормоза будут при выводе и их решит кэш, то тут кэш не помощник, т.к. все глюки и тормоза будут при записи. При выводе в случае глюка дерево не увидит один посетитель, а в случае глюка при записи - все.