no, mi sono spiegato male probabilmente
parlavo di usare
http://dev.mysql.com/doc/refman/5.1/...#operator_case
dentro l'ORDER BY
cosi da restituire un valore fittizzio all'order by e riposizionare per come ti pare e piace i valori
questa soluzione è composta da una sola query (se funziona come deve, ti ripeto, non ho provato i case con l'order by su mysql) ed è indubbiamente più veloce e performante di quella effettuata tramite php
edit:
Ho fatto una prova proprio ora, funziona perfettamente 
Per farti un esempio
codice:
SELECT
SUBSTR(city_name, 1, 1), city_name
FROM
cities
ORDER BY
(
CASE SUBSTR(city_name, 1, 1)
WHEN 'z' THEN 1
WHEN 'c' THEN 2
WHEN 'y' THEN 3
WHEN 'i' THEN 4
WHEN 'p' THEN 5
WHEN 'f' THEN 6
ELSE 99
END
) ASC
questa query tira fuori dalla mia tabella dei comuni la prima lettera ed il nome del comuni mettendo quelli che iniziano per z primi, poi quelli che iniziano per c e sequenzialmente per y, per i, per p, per f e poi tutti gli altri senza distinzione
questa query dovrebbe fare quello che ti serve, la tabella dei comuni è 8100 record e la risposta è istantanea, 0.069 secondi ... penso che non dovresti avere problemi di peso 
RI-EDIT
codice:
SELECT
(
CASE SUBSTR(city_name, 1, 1)
WHEN 'z' THEN 1
WHEN 'c' THEN 2
WHEN 'y' THEN 3
WHEN 'i' THEN 4
WHEN 'p' THEN 5
WHEN 'f' THEN 6
ELSE 99
END
) AS group_code, city_name
FROM
cities
ORDER BY group_code ASC
questa a differenza della precedenza, il codice di raggruppamento te lo restituisce quindi poi puoi stampare i risultati semplicemente verificando quando il contenuto della colonna varia
Codice PHP:
$old_group_code = '';
while($row = mysql_fetch_assoc($query))
{
// Verifica se il codice è variato
if ($old_group_code != $row['group_code'])
{
// Dato che il gruppo è variato stampa l'intestazione del gruppo
echo "Codice gruppo [b]" . $row['group_code'] . "[/b]
\r\n";
// Acquisisce il nuovo codice
$old_group_code = $row['group_code'];
}
// Stampa la riga
echo $row['city_name'] . "
\r\n";
}