Stai ottenendo il risultato atteso. Se hai il set di risultati a,b,c,d , stai iniziando con a che è una categoria padre, quindi torna all'inizio dell'insieme e scorre a,b,c,d ancora come sottocategorie. Ora sei alla fine del set, quindi entrambi i loop usciranno poiché non ci sono più dati.
Quello che probabilmente vuoi fare è leggere prima tutti i dati in un array PHP, quindi scorrere su quello e costruire una sorta di struttura ad albero. Potresti anche essere in grado di costruire la tua struttura ad albero direttamente nel ciclo mysql_fetch.
A seconda di ciò che stai cercando di ottenere, ci sono anche modi migliori per archiviare i tuoi dati. Vale la pena leggere come archiviare alberi e dati gerarchici in SQL. I set nidificati sono probabilmente ciò che desideri.
Un'altra cosa:non usare mysql_fetch_array , usa mysql_fetch_assoc invece. Altrimenti ti ritroverai con chiavi numeriche e associative e un array di righe che contiene il doppio della quantità di dati che dovrebbe.