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