ovviamente non puoi in alcun modo fare una cosa del genere direttamente tramite il database:
- quello che tu chiedi riguarda DIRETTAMENTE php e non il database che ti restituisce i dati
- MySQL, cosi come qualsiasi altra piattaforma, contengono i dati che tu vai ad estrarre e questi sono "liste" su tabelle diverse, al massimo in questi dati che vai a estrarre puoi serializzare/deserializzare degli oggetti ( www.php.net/serialize www.php.net/unserialize ) cosi da avere quasi quello che vuoi (essendo serializzati, però, non puoi fare ricerche con semplicità all'interno)

Poi per carità, ci sono delle estensioni per DB2 che ad esempio ti permettono di buttare fuori dell'XML, cosi come altre piattaforme, ma non so se comunque ti permettono di fare una cosa direttamente da una query, ovvero senza passare da una stored procedure o da una subquery (la join mette di fila tutto, la subquery si capisce che è una "ramificazione" della query e quindi potrebbe anche essere strutturata come vuoi tu con apposite estensioni solo che sono più lente e pesanti dato che verrebbe eseguita una subquery per ogni riga dell'utente che vai ad estrarre

La soluzione più semplice è ovviamente modificare il ciclo While che ti crea l'elenco per far si che ti crei la struttura che vuoi tu, qualcosa tipo

Codice PHP:
$sql "SELECT `users`.`id`, `users_values`.`id_attribute`, `users_values`.`value` FROM `users` LEFT JOIN `users_values` ON users_values.id_user = users.id";
$query mysql_query($sql) or die("Errore nella query
<pre>" 
$sql "</pre>

<pre>" 
mysql_error() . "</pre>
"
);

$users = array();
while(
$row mysql_fetch_object($query))
{
  if (isset(
$users[$row->id]) === false)
  {
    
$user = new stdClass;
    
$user->Id $row->id;
    
$user->Values = array();
    
$users[$row->id] = $user;
  }

  
$users[]->Values[$row->id_attribute] = $row->value
}

mysql_free_result($query); 
PS: sposto il thread in PHP