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

Drej et mysql-resultatsæt og opret html-tabel/matrix

Der vil være mange måder at gøre dette på; nogle teknikker involverer sql for at forberede den dynamiske pivot. Mit uddrag nedenfor vil bruge php til at udføre pivoten.

  1. Sløjfe gennem resultatsætobjektet med en foreach() -- nej, du behøver ikke kalde en hentefunktion for at få adgang til dataene, fordi resultatobjektet kan itereres.
  2. Opret et multidimensionelt grupperingssystem med navne som nøgler på første niveau, derefter subarrays med år som nøgler og værdier som værdier.
  3. Opret en række unikke år. Min tilgang vil sikre unikhed ved at tildele året som både nøglen og værdien -- fordi arrays ikke kan indeholde duplikerede nøgler, vil værdierne være unikke uden at skulle kalde array_unique() senere.
  4. Sorter årene ASC
  5. Opret en række standardværdier for hvert år. I dette tilfælde tildeler jeg - som standardværdi.
  6. Tilføj det bogstavelige ord name foran i arrayet, der indeholder unikke årstal -- dette vil blive brugt til at udfylde tabellens overskriftsrække.
  7. Jeg foretrækker at bruge implode() at lave en tabelrække med variabel celler.
  8. printf() er en ren måde at blande bogstavelig tekst med variabler -- den undgår interpolation/sammenkædningssyntaks.
  9. I hver efterfølgende tabelrække skal du erstatte de årlige standardværdier med den relative persons årlige værdier og præsenteres med implode() .
  10. Hvis der er nogen chance for, at resultatsættet er tomt, vil du måske pakke det meste af dette uddrag i en if ($resultObject) { ... } blokere.

Kode:(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:(med tilføjet mellemrum/tabulering for lettere læsning)

<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>


  1. Sådan finder du den sidste dag i måneden i SQL Server

  2. cursor.execute(INSERT INTO im_entry.test (+entrym+) VALUES ('+p+');)

  3. Hvordan forbinder man mysql workbench til at køre mysql inde i docker?

  4. Konverter mysql DATETIME kolonne til epoke sekunder