Mysql
 sql >> Base de données >  >> RDS >> Mysql

Faites pivoter un jeu de résultats mysql et créez une table/matrice html

Il y aura de nombreuses façons de le faire; certaines techniques impliquent sql pour préparer le pivot dynamique. Mon extrait ci-dessous utilisera php pour effectuer le pivot.

  1. Parcourir l'objet de l'ensemble de résultats avec un foreach() -- non, vous n'avez pas besoin d'appeler une fonction de récupération pour accéder aux données car l'objet de résultat est itérable.
  2. Créez un tableau de regroupement multidimensionnel avec des noms comme clés de premier niveau, puis des sous-tableaux avec des années comme clés et des valeurs comme valeurs.
  3. Créez un tableau d'années uniques. Mon approche garantira l'unicité en attribuant l'année à la fois à la clé et à la valeur - car les tableaux ne peuvent pas contenir de clés dupliquées, les valeurs seront uniques sans avoir à appeler array_unique() plus tard.
  4. Trier les années ASC
  5. Créez un tableau de valeurs par défaut pour chaque année. Dans ce cas, j'attribue - comme valeur par défaut.
  6. Ajouter le mot littéral name au début du tableau contenant des années uniques -- ceci sera utilisé pour remplir la ligne d'en-tête du tableau.
  7. Je préfère utiliser implode() pour créer une ligne de tableau à cellules variables.
  8. printf() est un moyen propre de mélanger du texte littéral avec des variables - cela évite la syntaxe d'interpolation/concaténation.
  9. Dans chaque ligne suivante du tableau, remplacez les valeurs annuelles par défaut par les valeurs annuelles de la personne relative et présentez-les avec implode() .
  10. S'il y a une chance que le jeu de résultats soit vide, alors vous voudrez peut-être envelopper la majeure partie de cet extrait dans un if ($resultObject) { ... } bloquer.

Code :(Démo )

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

Sortie :(avec espacement/tabulation ajouté pour une lecture plus 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>