sql >> Databasteknik >  >> RDS >> Mysql

Pivotera en mysql-resultatuppsättning och skapa html-tabell/matris

Det kommer att finnas många sätt att göra detta på; vissa tekniker involverar sql för att förbereda den dynamiska pivoten. Mitt utdrag nedan kommer att använda php för att utföra pivoten.

  1. Slinga genom resultatuppsättningsobjektet med en foreach() -- nej, du behöver inte anropa en hämtningsfunktion för att komma åt data eftersom resultatobjektet är iterbart.
  2. Skapa en flerdimensionell grupperingsmatris med namn som nycklar på första nivån, sedan subarrayer med årtal som nycklar och värden som värden.
  3. Skapa en rad unika år. Mitt tillvägagångssätt kommer att säkerställa unikhet genom att tilldela året som både nyckel och värde -- eftersom arrayer inte kan innehålla dubblerade nycklar, kommer värdena att vara unika utan att behöva anropa array_unique() senare.
  4. Sortera åren ASC
  5. Skapa en uppsättning standardvärden för varje år. I det här fallet tilldelar jag - som standardvärde.
  6. Lägg till det bokstavliga ordet name längst fram i arrayen som innehåller unika årtal -- detta kommer att användas för att fylla i rubrikraden i tabellen.
  7. Jag föredrar att använda implode() för att skapa en tabellrad med variabel cell.
  8. printf() är ett rent sätt att blanda bokstavlig text med variabler -- det undviker interpolations-/konkateneringssyntax.
  9. I varje efterföljande tabellrad, ersätt de årliga standardvärdena med den relativa personens årliga värden och presentera med implode() .
  10. Om det finns någon chans att resultatuppsättningen är tom, kanske du vill slå in det mesta av detta utdrag i en if ($resultObject) { ... } blockera.

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

Utdata:(med extra mellanrum/flikar för enklare 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. PDO Error - PDOException' med meddelandet 'SQLSTATE[HY000]:Allmänt fel'

  2. Två främmande nycklar istället för primära

  3. Behöver hjälp med att komma åt mysql-databasen med node.js

  4. Hur POSITION() fungerar i PostgreSQL