Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Dinamize um conjunto de resultados mysql e crie uma tabela/matriz html


Haverá muitas maneiras de fazer isso; algumas técnicas envolvem sql para preparar o pivô dinâmico. Meu trecho abaixo usará php para realizar o pivô.
  1. Percorra o objeto do conjunto de resultados com um foreach() -- não, você não precisa chamar uma função de busca para acessar os dados porque o objeto de resultado é iterável.
  2. Crie uma matriz de agrupamento multidimensional com nomes como chaves de primeiro nível e, em seguida, subarrays com anos como chaves e valores como valores.
  3. Crie uma matriz de anos únicos. Minha abordagem garantirá a exclusividade atribuindo o ano como a chave e o valor -- como os arrays não podem conter chaves duplicadas, os valores serão únicos sem precisar chamar array_unique() mais tarde.
  4. Classifique os anos ASC
  5. Crie uma matriz de valores padrão para cada ano. Neste caso, estou atribuindo - como o valor padrão.
  6. Adicione a palavra literal name para a frente da matriz contendo anos exclusivos -- isso será usado para preencher a linha de cabeçalho da tabela.
  7. Prefiro usar implode() para criar uma linha de tabela com células variáveis.
  8. printf() é uma maneira limpa de misturar texto literal com variáveis ​​-- evita a sintaxe de interpolação/concatenação.
  9. Em cada linha subsequente da tabela, substitua os valores anuais padrão pelos valores anuais da pessoa relativa e apresente com implode() .
  10. Se houver alguma chance de que o conjunto de resultados esteja vazio, convém envolver a maior parte desse snippet em um if ($resultObject) { ... } bloquear.

Código:(Demonstração )
$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>";

Saída:(com espaçamento/tabs adicionais para facilitar a leitura)
<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>