Изначально, пораскинув мозгами я пришел к следующей структуре:
- Код: Выделить всё
- comments
 ------------
 id
 publication_id
 content
 parent_id
 has_childs
Где parent_id - ид коммента родителя, а has_childs, по моей задумке должно играть роль остановки рекурсии. Ведь по идее кол-во комментов и тредов к ним бесконечное количество. Т.е. рекурсивная ф-ция ищет детей для текущего коммента до тех пор пока has_childs равно 1.
Так вот, все хорошо, но нужно составить такой селект, который мне вернет что то типа следующей коллекции:
- Код: Выделить всё
- Array
 (
 [0] => Array
 (
 [0] => Array
 (
 [id] => 1
 [content] => test
 [child] => Array
 (
 [0] => Array
 (
 [id] => 2
 [content] => мама
 [publication_id] => 1
 )
 [1] => Array
 (
 [id] => 3
 [content] => папа
 [publication_id] => 1
 )
 )
 )
 [1] => Array
 (
 [id] => 4
 [content] => баба
 [publication_id] => 1
 )
 )
Конечно, ограничений на вложения не должно быть. На данный момент, я делаю эту конструкцию в два этапа:
1.
- Код: Выделить всё
- SELECT * FROM comments WHERE parent_id=0
2. Для каждого родителя делаю выборку всех детей:
- Код: Выделить всё
- SELECT * FROM comments WHERE id= prev.parent_id
Самые большие потери при втором шаге, где рекурсивно делаются вызовы к базе. Я уверен, что эту рекурсию можно сделать на самой базе дабы минимизировать потери времени.
К сожалению, я не очень хорошо разбираюсь с SQL, но активно читаю мануалы и исходники. Ну а заодно, прошу вас, форумчане помочь мне в составлении селекта. Огромное спасибо всем заглянувшим







 

