Mysql
 sql >> база данни >  >> RDS >> Mysql

Завъртете набор от резултати на mysql и създайте html таблица/матрица

Ще има много начини да направите това; някои техники включват sql за подготовка на динамичната опора. Моят фрагмент по-долу ще използва php за извършване на въртене.

  1. Прегледайте обекта на набора от резултати с foreach() -- не, не е необходимо да извикате функция за извличане, за да получите достъп до данните, тъй като резултатният обект е итерируем.
  2. Създайте многоизмерен групиращ масив с имена като ключове от първо ниво, след това подмасиви с години като ключове и стойности като стойности.
  3. Създайте масив от уникални години. Моят подход ще гарантира уникалност, като присвоява годината и като ключ, и като стойност - тъй като масивите не могат да съдържат дублирани ключове, стойностите ще бъдат уникални, без да се налага да се извиква array_unique() по-късно.
  4. Сортиране на годините ASC
  5. Създайте масив от стойности по подразбиране за всяка година. В този случай присвоявам - като стойност по подразбиране.
  6. Добавете буквалната дума name в предната част на масива, съдържащ уникални години – това ще се използва за попълване на заглавния ред на таблицата.
  7. Предпочитам да използвам implode() за да създадете ред на таблица с променливи клетки.
  8. printf() е чист начин за смесване на буквален текст с променливи - избягва синтаксиса на интерполация/конкатенация.
  9. Във всеки следващ ред на таблицата заменете годишните стойности по подразбиране с годишните стойности на съответното лице и ги представете с implode() .
  10. Ако има някакъв шанс резултатният набор да е празен, тогава може да искате да обвиете по-голямата част от този фрагмент в if ($resultObject) { ... } блок.

Код:(Демо )

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

Изход:(с добавено разстояние/табулация за по-лесно четене)

<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. MySql битови колони връща странно голямо число в PHP 7.1 (не в предишни версии)

  2. Мога ли да използвам подготвен израз на PDO, за да обвържа идентификатор (име на таблица или поле) или ключова дума за синтаксис?

  3. MySQL не изтрива записи

  4. Как да напиша REST API?

  5. 1-ви ред в група по срещу последен ред