Se você quiser que isso seja feito na consulta do MySQL, é honestamente mais problema do que vale a pena. Por um lado, a sintaxe é realmente instável (pelo que me lembro) para ter um nome de grupo listado no topo de cada agrupamento. E os resultados ainda são tratados como linhas, então o nome do grupo será tratado como uma linha com todas as outras colunas como Nulos, então você não economizará tempo ou esforço no script PHP, pois ele precisa fazer uma instrução if para detectar quando atinge um nome de grupo em vez dos dados do grupo.
Se você quer que seja feito pelo loop while do PHP, Johan está no caminho certo. Eu uso o seguinte para uma situação semelhante:
$result = $sql->query($query);
$prev_group = "";
while($data = $result->fetch_assoc()){
$curr_group = $data['group'];
if ($curr_group !== $prev_group) {
echo "<h1>$curr_group</h1>";
$prev_group = $curr_group;
}
else {
echo $data;
.....
}
Obviamente, os dados de eco seriam configurados para ecoar as partes dos dados da maneira que você deseja. Mas o $prev_group/$curr_group está configurado para que a única vez que eles não correspondam é quando você está em um novo grupo e, portanto, deseja imprimir algum tipo de cabeçalho.