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 ";
$risultato= mysql_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>
<?
}
?>