Сначала фрагмент / файл, затем объяснение и детали ...
<style>
.table-bordered {border: solid 1px grey;}
thead tr th {border: solid 1px blue;}
tbody tr td {border: solid 1px green;}
.Sday {background-color: red;}
</style>
<?php
if (!$conn = new mysqli("localhost", "root","","db")) {
echo "Database Connection Error"; // $conn->connect_error
} else {
// Generate derived table comprised of united hardcoded dates for the current month with minimal function calls
$ym = date('Y-m-');
$derived_table = '';
for ($d = 1, $end = date('t'); $d <= $end; ++$d) {
$date = $ym . str_pad($d, 2, 0, STR_PAD_LEFT); // format the date without calling strtotime() & date() each iteration
if ($d == 1) {
$derived_table .= "SELECT '$date' AS event_date_start"; // only need to name the first column
} else {
$derived_table .= " UNION SELECT '$date'";
}
}
$query = "SELECT
DATE_FORMAT(A.event_date_start, '%b %e, %Y') AS Date,
DAYNAME(A.event_date_start) AS Day,
GROUP_CONCAT(
IF(event_type = 'GCRSA Club Meet', CONCAT(swim_club_assigned, ' ', event_description), null)
SEPARATOR '<br>'
) AS `Club Meet`,
GROUP_CONCAT(
IF(event_type = 'GCRSA Championship', CONCAT(swim_club_assigned, ' ', event_description), null)
SEPARATOR '<br>'
) AS `Championship`
FROM ($derived_table) A
LEFT JOIN eventcalendar B ON A.event_date_start = B.event_date_start
GROUP BY A.event_date_start";
if (!$result = $conn->query($query)) {
echo "Syntax Error"; // $conn->error
} else {
?>
<table class="table table-bordered">
<thead>
<tr>
<th rowspan="2" colspan="2">Date</th>
<th colspan="3">GCRSA Region</th>
<th colspan="2">State, SAL, Intl</th>
<th colspan="2">Other events</th>
</tr>
<tr style="border-bottom: 1pt Darkblue;">
<th>Club meet</th>
<th>Championship</th>
<th>Development</th>
<th>SQ</th>
<th>Sal</th>
<th>School Meets</th>
<th>Qld School Holidays</th>
</tr>
</thead>
<tbody>
<?php
while ($row = $result->fetch_assoc()) {
echo "<tr>";
echo "<td class=\"{$row['Day'][0]}day\">{$row['Date']}</td>";
echo "<td class=\"{$row['Day'][0]}day\">{$row['Day']}</td>";
echo "<td>{$row['Club Meet']}</td>";
echo "<td>{$row['Championship']}</td>";
echo "<td></td>";
echo "<td></td>";
echo "<td></td>";
echo "<td></td>";
echo "<td></td>";
echo "</tr>";
}
?>
</tbody>
</table>
<?php
}
}
SQL-запрос является рабочей лошадкой этого сценария.Сгенерировав «производную таблицу», содержащую все даты в текущем месяце (по порядку), затем СЛЕДУЕТ ПОДКЛЮЧИТЬ к ней фактические данные таблицы базы данных и группировать по event_date_start
, аналогичные данные можно сгруппировать, полностью подготовить идоставлено в строгом наборе результатов.
Обратите внимание на мой трюк с классом / css с помощью {$row['Day'][0]}day
<- <code>[0] означает «отображать только первый символ. Это делает атрибуты класса такими, как Mday
, Fday
и т. д. Чтобы избежать условной проверки, я назначаю субботам и воскресеньям Sday
, чтобы стилизация была простой.
Если вы хотите знать, как выглядит обработанный запрос для этого месяца:
Производная таблица PHP Demo
Я не удосужился добавить неиспользуемые столбцы во время разработки этого решения, но вот данные, которые я использовал для тестирования:
CREATE TABLE IF NOT EXISTS `eventcalendar` (
`event_description` varchar(255) NOT NULL,
`event_date_start` date NOT NULL,
`event_date_end` date NOT NULL,
`event_type` varchar(255) NOT NULL,
`swim_club_assigned` varchar(255) NOT NULL,
PRIMARY KEY (`event_description`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `eventcalendar` (`event_description`, `event_date_start`, `event_date_end`, `event_type`, `swim_club_assigned`) VALUES
('Another Championship one!', '2018-10-11', '2018-10-11', 'GCRSA Championship', 'My Club 2'),
('Another one!', '2018-10-11', '2018-10-11', 'GCRSA Club Meet', 'My Club'),
('Dunno Invitational - Template: Z', '2018-11-12', '2018-11-12', 'GCRSA Championship', ''),
('Preparation Meet (LC) - Template: A', '2018-10-01', '2018-10-01', 'GCRSA Club Meet', 'Gold Coast North SC Inc'),
('Reg Winter Championships (SC) - Template: XY', '2018-10-31', '2018-10-31', 'GCRSA Championship', ''),
('Sprint Meet (LC) - Template: H', '2018-10-11', '2018-10-11', 'GCRSA Club Meet', 'Bond SC Inc');
И вот что он сделал: