Изначально, пораскинув мозгами я пришел к следующей структуре:
- Код: Выделить всё
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, но активно читаю мануалы и исходники. Ну а заодно, прошу вас, форумчане помочь мне в составлении селекта. Огромное спасибо всем заглянувшим
