Страницы

Поиск по вопросам

вторник, 5 марта 2019 г.

Нестандартный вид вывода таблицы в php из MySql

Доброго времени суток, прошу помощи, ситуация такая: есть таблица в MySql:
задача: вывести ее на страницу в виде:
шапку таблицы создавал следующим образом:
connect_errno) { printf("Соединение не удалось: %s
", $mysqli->connect_error); exit(); } $sqltableclandate = "SELECT * FROM `nametable` GROUP BY Date"; $sqltableclanResultdate = $mysqli->query($sqltableclandate); while($tableclandate = $sqltableclanResultdate->fetch_assoc()) {?>
А вот дальше затык....
Подскажите куда копать и где искать)
Забыл вчера добавить: Добавление: если за какую-то дату нет информации, то в ячейке должен быть 0 или Н/Д
Добавление всего кода таблицы на данный момент:

Статистика:

query($query_dateclan)){ $rowclandate=$resultclandate->fetch_assoc(); $kol_rowsclandate = $resultclandate->num_rows; for($i=0; $i<$kol_rowsclandate; $i++){?>
Дата


вид базы: таблица: stat (как видно name5 появился позже)


Ответ

Можно воспользоваться функцией GROUP_CONCAT(), которая позволяет вывести списки каждой из групп, получаемых GROUP BY. Обычно в GROUP_CONCAT() передают имя столбца, но тут потребуется два значения - дата и gold. Их можно объединить при помощи CONCAT() каким-нибудь уникальным разделителем, например, решеткой.
SELECT GROUP_CONCAT(CONCAT(data, "#", gold)) AS data_gold FROM gold GROUP BY name +-------------------------------------------+ | data_gold | +-------------------------------------------+ | 2016-08-27#10,2016-08-28#15,2016-08-29#20 | | 2016-08-27#20,2016-08-28#25,2016-08-29#30 | | 2016-08-27#30,2016-08-28#35,2016-08-29#40 | | 2016-08-27#40,2016-08-28#45,2016-08-29#50 | +-------------------------------------------+
В PHP-коде можно сначала разбить строку по запятой (например, функцией explode()), а потом каждый элемент полученного массива еще раз разбить по #. GROUP_CONCAT допускает сортировку, а по полученной дате вы всегда сможете определить к какой ячейке должен относиться текущей элемент.
Для формирования результирующей таблицы можно воспользоваться следующим PHP-кодом:
PDO::ERRMODE_EXCEPTION));
function parse_gold($str) { $elements = explode(',', $str); $arr = array(); foreach($elements as $el) { list($date, $gold) = explode('#', $el); $arr[$date] = $gold; } return $arr; }
$query = "SELECT name, GROUP_CONCAT(CONCAT(data, '#', gold)) AS data_gold FROM gold GROUP BY name"; $usr = $pdo->query($query);
$users = array(); while($user = $usr->fetch()) { $users[$user['name']] = parse_gold($user['data_gold']); } $dates = array(); foreach($users as $user) { $dates += array_keys($user); } echo '

'; // Шапка echo ''; foreach($dates as $date) { echo ""; } echo ''; // Содержимое таблицы foreach($users as $name => $golds) { echo ''; echo ""; foreach($dates as $date) { if(array_key_exists($date, $golds)) { echo ""; } else { echo ""; } } echo ''; } echo '
Имя$date
$name{$golds[$date]}-
'; } catch (PDOException $e) { echo "Ошибка выполнения запроса: " . $e->getMessage(); }

Комментариев нет:

Отправить комментарий