Una consulta está bien. Como lo tienes, y probablemente la mejor opción. Tienes que averiguar cuál es más eficiente, dejar que MySQL tome la carga, o que la red y PHP tomen la carga. Es mucho mejor dejar que PHP tome el esfuerzo que MySQL, pero donde MySQL tiene funciones "incorporadas", como la agrupación que desea, entonces deje MySQL y guarde el tráfico de red.
Para que esto funcione:agregue "ORDER BY p.post_id, pc.comment_id" a su consulta; esto obtiene los resultados en orden.
Luego, si debe crear una matriz (aunque es posible que pueda procesar directamente sin usar una matriz, el método sería similar):
$lastPostID = 0;
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
if ($lastPostID <> $row['post_id']) {
$lastPostID = $row['post_id'];
$answers[$lastPostID] = array('post_id' => $row['post_id'],
'author_id' => $row['author_id'],
etc
'comments' => array() );
}
$answers[$lastPostID]['comments'][] = array('comment_id' => $row['comment_id'], 'coment' => $row['comment'] etc);
}