Es un problema de SQL, no de PHP, sería mejor tratarlo en el foro de BBDDD, pero te puedo adelantar algo;
El problema es que el ordenamiento es posterior a la agrupación, por lo que primero agrupa en el orden en que encuentra los registros y recién allí ordena. Eso hace que el primer registro encontrado "esconda" a los demás, y como el orden de lectura es el orden cronológico ascendente, el primero de la lista es el más viejo, no el mas nuevo.
La solución más sencilla es meter todo esto en una subconsulta, y que recién se agrupe en la exterior:
En PHP sería:
Código PHP:
Ver original$sql = "SELECT tema, autor, fecha, categoria"
$sql .= "FROM"
$sql .= " (SELECT tema, autor, fecha, categoria"
$sql .= " FROM temas "
$sql .= " ORDER BY fecha DESC) T1"
$sql .= "GROUP BY categoria;"