sql >> Database >  >> RDS >> Mysql

Draai een mysql-resultatenset en maak een html-tabel/matrix

Er zullen veel manieren zijn om dit te doen; sommige technieken hebben betrekking op sql om de dynamische spil voor te bereiden. Mijn fragment hieronder gebruikt php om de spil uit te voeren.

  1. Loop door het resultaatset-object met een foreach() -- nee, u hoeft geen ophaalfunctie aan te roepen om toegang te krijgen tot de gegevens, omdat het resultaatobject itereerbaar is.
  2. Maak een multidimensionale groeperingsmatrix met namen als de sleutels op het eerste niveau en vervolgens subarrays met jaren als sleutels en waarden als waarden.
  3. Maak een reeks unieke jaren. Mijn aanpak zorgt voor uniciteit door het jaar toe te wijzen als zowel de sleutel als de waarde -- omdat arrays geen dubbele sleutels kunnen bevatten, zullen de waarden uniek zijn zonder dat je array_unique() hoeft aan te roepen later.
  4. Sorteer de jaren ASC
  5. Maak een reeks standaardwaarden voor elk jaar. In dit geval wijs ik - . toe als de standaardwaarde.
  6. Voeg het letterlijke woord name toe aan de voorkant van de array met unieke jaren -- dit wordt gebruikt om de koprij van de tabel te vullen.
  7. Ik gebruik liever implode() om een ​​tabelrij met variabele cellen te maken.
  8. printf() is een schone manier om letterlijke tekst te mengen met variabelen -- het vermijdt interpolatie/aaneenschakeling syntaxis.
  9. Vervang in elke volgende tabelrij de standaard jaarwaarden door de jaarwaarden van de relatieve persoon en presenteer met implode() .
  10. Als de kans bestaat dat de resultatenset leeg is, wilt u misschien het grootste deel van dit fragment in een if ($resultObject) { ... } plaatsen blok.

Code:(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>";

Uitvoer:(met extra spatiëring/tabbladen voor gemakkelijker lezen)

<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. Hoe Asin() werkt in PostgreSQL

  2. 4 uitvoermodi in tabelvorm in SQLite

  3. Kan MySQL meerdere tekens vervangen?

  4. Grondbeginselen van tabeluitdrukkingen, deel 9 – Weergaven, vergeleken met afgeleide tabellen en CTE's