Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Pivotieren Sie eine MySQL-Ergebnismenge und erstellen Sie eine HTML-Tabelle/Matrix

Es wird viele Möglichkeiten geben, dies zu tun; Einige Techniken beinhalten SQL, um den dynamischen Pivot vorzubereiten. Mein Snippet unten verwendet PHP, um den Pivot durchzuführen.

  1. Durchlaufen Sie das Ergebnismengenobjekt mit einem foreach() -- nein, Sie müssen keine Abruffunktion aufrufen, um auf die Daten zuzugreifen, da das Ergebnisobjekt iterierbar ist.
  2. Erstellen Sie ein mehrdimensionales Gruppierungsarray mit Namen als Schlüssel der ersten Ebene, dann Subarrays mit Jahren als Schlüssel und Werten als Werten.
  3. Erstellen Sie eine Reihe eindeutiger Jahreszahlen. Mein Ansatz stellt die Eindeutigkeit sicher, indem er das Jahr sowohl als Schlüssel als auch als Wert zuweist – da Arrays keine doppelten Schlüssel enthalten können, sind die Werte eindeutig, ohne dass array_unique() aufgerufen werden muss später.
  4. Sortieren Sie die Jahreszahlen ASC
  5. Erstellen Sie ein Array von Standardwerten für jedes Jahr. In diesem Fall weise ich - zu als Standardwert.
  6. Fügen Sie das wörtliche Wort name hinzu an den Anfang des Arrays, das eindeutige Jahreszahlen enthält -- dies wird verwendet, um die Kopfzeile der Tabelle zu füllen.
  7. Ich bevorzuge die Verwendung von implode() um eine Tabellenzeile mit variablen Zellen zu erstellen.
  8. printf() ist ein sauberer Weg, wörtlichen Text mit Variablen zu verschmelzen – es vermeidet Interpolations-/Verkettungssyntax.
  9. Ersetzen Sie in jeder nachfolgenden Tabellenzeile die Standardjahreswerte durch die Jahreswerte der entsprechenden Person und präsentieren Sie sie mit implode() .
  10. Wenn die Möglichkeit besteht, dass die Ergebnismenge leer ist, sollten Sie den größten Teil dieses Ausschnitts in ein if ($resultObject) { ... } einschließen blockieren.

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

Ausgabe:(mit zusätzlichem Abstand/Tabulator zum leichteren Lesen)

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