Hola,
Brevemente ... SQL devuelve la primera letra del código en mayúsculas, PHP mientras recorre el Resultado guarda dicha letra y solamente la muestra cuando cambia, y tienes que contemplar los casos especiales, 0 ..9.
Código PHP:
$r = mysql_query('select upper(left(ltrim(codigo), 1)) as letra, codigo, nombre from manga order by letra', $link);
$letra = ' ';
while ($c = mysql_fetch_assoc($r)) {
$temp = ($c['letra'] >= '0' && $c['letra'] <= '9') ? '0 .. 9' : $c['letra'];
if ($letra != $temp) { echo "<h1>$temp</h1><br />\n"; $letra = $temp; }
echo "<p>{$c['codigo']} - {$c['nombre']}</p><br />\n";
}
¿Convence?
Saludos,