Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Obróć zestaw wyników mysql i utwórz tabelę/macierz html

Będzie na to wiele sposobów; niektóre techniki wymagają sql do przygotowania dynamicznego obrotu. Mój fragment poniżej użyje php do wykonania osi.

  1. Przejdź w pętlę przez obiekt zestawu wyników za pomocą foreach() -- nie, nie musisz wywoływać funkcji pobierającej, aby uzyskać dostęp do danych, ponieważ obiekt wynikowy jest iterowalny.
  2. Utwórz wielowymiarową tablicę grupującą z nazwami jako kluczami pierwszego poziomu, a następnie podtablicami z latami jako kluczami i wartościami jako wartościami.
  3. Utwórz tablicę unikalnych lat. Moje podejście zapewni unikatowość, przypisując rok zarówno jako klucz, jak i jako wartość — ponieważ tablice nie mogą zawierać zduplikowanych kluczy, wartości będą unikalne bez konieczności wywoływania funkcji array_unique() później.
  4. Posortuj lata ASC
  5. Utwórz tablicę wartości domyślnych dla każdego roku. W tym przypadku przypisuję - jako wartość domyślna.
  6. Dodaj dosłowne słowo name na początku tablicy zawierającej unikalne lata -- będzie to użyte do wypełnienia wiersza nagłówka tabeli.
  7. Wolę używać implode() aby utworzyć wiersz tabeli o zmiennych komórkach.
  8. printf() to czysty sposób na mieszanie dosłownego tekstu ze zmiennymi -- unika składni interpolacji/konkatenacji.
  9. W każdym kolejnym wierszu tabeli zastąp domyślne wartości roczne wartościami rocznymi względnej osoby i zaprezentuj implode() .
  10. Jeśli istnieje jakakolwiek szansa, że ​​zestaw wyników jest pusty, możesz chcieć umieścić większość tego fragmentu w if ($resultObject) { ... } blokować.

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

Dane wyjściowe:(z dodanymi odstępami / tabulatorami dla łatwiejszego czytania)

<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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak porównywać wartości zerowe w MySQL

  2. MySQL, stwórz prostą funkcję

  3. PHP + MySQL:różnica między zapytaniami buforowanymi i niebuforowanymi

  4. Czy MySQL LIMIT jest stosowany przed czy po ORDER BY?

  5. MySQL — funkcja FOUND_ROWS() dla całkowitej liczby wierszy, których dotyczy problem