Mysql
 sql >> Database >  >> RDS >> Mysql

Ruota un set di risultati mysql e crea una tabella/matrice html

Ci saranno molti modi per farlo; alcune tecniche coinvolgono sql per preparare il pivot dinamico. Il mio snippet di seguito utilizzerà php per eseguire il pivot.

  1. Scorri l'oggetto set di risultati con un foreach() -- no, non è necessario chiamare una funzione di recupero per accedere ai dati perché l'oggetto risultato è iterabile.
  2. Crea un array di raggruppamento multidimensionale con nomi come chiavi di primo livello, quindi sottoarray con anni come chiavi e valori come valori.
  3. Crea una serie di anni unici. Il mio approccio garantirà l'unicità assegnando l'anno sia come chiave che come valore -- poiché gli array non possono contenere chiavi duplicate, i valori saranno univoci senza dover chiamare array_unique() dopo.
  4. Ordina gli anni ASC
  5. Crea una matrice di valori predefiniti per ogni anno. In questo caso, sto assegnando - come valore predefinito.
  6. Aggiungi la parola letterale name all'inizio dell'array contenente anni univoci:verrà utilizzato per popolare la riga di intestazione della tabella.
  7. Preferisco usare implode() per creare una riga di tabella a celle variabili.
  8. printf() è un modo pulito per fondere il testo letterale con le variabili -- evita la sintassi di interpolazione/concatenazione.
  9. In ogni riga successiva della tabella, sostituisci i valori annuali predefiniti con i valori annuali della persona relativa e presenta con implode() .
  10. Se è possibile che il set di risultati sia vuoto, potresti voler racchiudere la maggior parte di questo snippet in un if ($resultObject) { ... } blocco.

Codice:(Demo )

$grouped = [];
$columns = [];    

$resultObject = $mysqli->query("SELECT `name`, `value`, `year` FROM `Testab`");
foreach ($resultObject as $row) {
    $grouped[$row['name']][$row['year']] = $row['value'];
    $columns[$row['year']] = $row['year'];
}

sort($columns);
$defaults = array_fill_keys($columns, '-');
array_unshift($columns, 'name');

echo "<table>";
    printf(
        '<tr><th>%s</th></tr>',
        implode('</th><th>', $columns)
    );
    foreach ($grouped as $name => $records) {
        printf(
            '<tr><td>%s</td><td>%s</td></tr>',
            $name,
            implode('</td><td>', array_replace($defaults, $records))
        );
    }
echo "</table>";

Output:(con spaziatura/tabulazioni aggiunte per una lettura più facile)

<table>
    <tr>
        <th>name</th> <th>2018</th> <th>2019</th> <th>2020</th>
    </tr>
    <tr>
        <td>Tom</td>  <td>15</td>   <td>4</td>    <td>6</td>
    </tr>
    <tr>
        <td>Kate</td> <td>18</td>   <td>20</td>   <td>-</td>
    </tr>
</table>