Я подозреваю, что вам нужно сделать редизайн базы данных, чтобы сохранить отношение потока / субъекта в поле, чтобы вы могли извлечь все потоки в одном запросе и затем программно отсортировать их в php. Если у вас есть поле parent_id, и каждая строка ответа знает, кто является его родителем и каков его порядок (предположительно, это просто id> предыдущий id), то довольно просто организовать их так, как вам нужно.
Затем вы можете просмотреть список ответов и выбросить все элементы в объект JSON (y), в котором все ваши вложенные ответы находятся в правильном порядке / отношении.
Чтобы уменьшить нежелательное раздувание, вы можете также сохранить родительский идентификатор верхнего уровня, чтобы вы могли легко извлекать только те потоки, которые принадлежат конкретным потокам верхнего уровня. Таким образом, вы можете легко захватывать только те потоки, которые принадлежат, например, последним 20 потокам верхнего уровня (чтобы уменьшить ненужные вычисления в древних потоках, которые никому не нужны, и построить своего рода разбиение на страницы).
РЕДАКТИРОВАТЬ ... некоторый псевдокод ...
select * from row order by top_level_id desc limit 0,20
// это даст вам максимум 20 потоков верхнего уровня, так что вы не тянете весь дб. 0 в конце должен быть переменной страницы, которую вы передаете из своего PHP, так что вы можете сделать 20,20 для страницы 2 и 40,20 для страницы 3
теперь вы делаете что-то вроде этого (очевидно, это псевдокод, но вы должны быть в состоянии сделать это на основе этой модели ...
$sortedRows; //this will be a JSON object, or hash array
for($row in result){
addToThreadObj($row);
}
function addToThreadObj($row){
if( containsParent($row.parent_id))
addChildToParent($row.parent_id, $row);
else
createNewParent($row);
}