Partendo dal presupposto che tu abbia un id_amico ho fatto in modo di ordinare in ordine alfabetico gli amici.

All'inizio istanzio una variabile $memoria a vuota.

Ogni volta che nel ciclo, all'interno della cella dove metti il nome dell'amico trovi una differenza fra $memoria e l'id dell'amico allora va scritto, altriementi esce una cella vuota.

Partendo da questa base puoi fare quello che vuoi.

Codice PHP:
<?
$query
="SELECT * FROM amici LEFT JOIN hobby ON amici.id_amico=hobby.id_amico order by cognome,nome ";
$risultatomysql_query($query);
?>
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">

<tr>
<td height="29" bgcolor="#FFFFCC"> </td>
<td bgcolor="#FFFFCC"> </td>
</tr>
<tr>
<td height="29" bgcolor="#FFFFCC"><div align="center" class="Stile18">Cognome e Nome</div></td>
<td width="21%" bgcolor="#FFFFCC"><div align="center" class="Stile18">hobby</div></td>
</tr>
<tr>
<?
$memoria
="";
while(
$rigo=mysql_fetch_array($risultato)){
?>


<td height="35" bgcolor="#FFffcc"><div align="center" class="Stile30">
<span class="Stile20">
<?php 
if($rigo['id_amico']!=$memoria){
$memoria=$rigo['id_amico'];
?>
Prof.</span>
<?=$rigo['cognome']?> 
<?=$rigo['nome']?>
<?php
}else{
?><?php
}
?>
</div></td>
<td bgcolor="#FFffcc"><div align="center" class="Stile30">
<?=$rigo['hobby']?>
</td>
<?
}
?>