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"
;