ho scritto del codice e funziona a patto di rispettare dei prerequisiti che in fondo sono anche buona norma.

Anzichè usare una mysql_connect e prendere i risultati con mysql_query e poi mysql_fetch_assoc e quindi chiudere la connessione, creati una funzione che faccia tutto quanto e ti restituisca un array associativo. Ti faccio un esempio con una query e il risultato che ottieni. La query sarà semplicemente "select id, nome from autore" e il risultato supponiamo che siano 2 record ecco quale dovrebbe essere il risultato:

Codice PHP:
$autore miafunc("select id, nome from autore"); 
risultato sarà: $autore[0]['id'] = 1 , $autore[0]['nome'] = 'dante', $autore[1]['id'] = 2 , $autore[1]['nome'] = 'manzoni';

Per ottenere una cosa del genere miafunc dovrebbe essere del tipo:

Codice PHP:

function miafunc($query){
               
//ti connetti al db
               
$conn mysql_connect($h$u$p);
               
//selezioni il db
               
mysql_selectdb($db$conn);
               
//ottieni i risultati e li copi in un array associativo
               
$res mysql_query($query$conn)
               
$items = array();
               while(
$items[] = mysql_fetch_assoc($res) ) ;
               
array_pop($items);
                
//chiudi la connessione
                
mysql_close($conn);
                return 
$items;
            } 
Finito con il primo prerequisito passiamo con il secondo ancora più utile, il db deve far si che si rispetti la relazione n a n tra autore e libro

Quindi di seguito le 3 tabelle e le relative strutture:

libri: id(int) pk, titolo(text)
autori : id(int) pk, nome(text)
autore_libro : id(int) pk, autore_id(int), libro_id(int), prezzo(float)

Tutte le pk sono autoincrement.

Detto questo posso finalmente postare tutto il codice necessario a fare quello che cerchi:

Codice PHP:

$autori 
miafunc("select autori.id, nome 
                        from autori inner join autore_libro 
                        on autori.id = autore_libro.autore_id
                        group by autori.id, nome"
);


$table "<table>\n<tr><th></th>";

foreach(
$autori as $autore){//per ogni autore
    
$table .= "<th id='autore_".$autore['id']."' >".$autore['nome']."</th>";
}

$table .= "</tr>\n";


$libri miafunc("select libri.id, titolo 
                        from libri inner join autore_libro
                        on libri.id = autore_libro.libro_id
                        group by libri.id, titolo"
);

foreach(
$libri as $libro){//per ogni libro
    
$table .= "<tr>";
    
$table .= "<td id='libro_".$libro['id']."'>".$libro['titolo']."</td>";

    foreach(
$autori as $autore){//per ogni autore e libro prendo il prezzo
        
$prezzo miafunc("select prezzo from autore_libro where libro_id=".$libro['id']." and autore_id=".$autore['id']); 
        
$prezzo = isset($prezzo[0])? number_format($prezzo[0]['prezzo'], 2","".") ."€" 'x';
        
$table .= "<td id='prezzo_'".$libro['id']."_".$autore['id']."'>".$prezzo."</td>";
    }

    
$table .= "</tr>\n";
}


$table .= "</table>";


echo 
$table

Così facendo ottieni il prezzo se esiste un libro per l'autore considerato o in alternativa il carattere 'x'. Vengono presi solo gli autori che hanno almeno un libro e quindi solo i libri che hanno almeno un autore. Vale lo stesso discorso se al posto dell'autore consideri l'edizione.