Tôi đã cố gắng hết sức để dọn dẹp mọi thứ, có thể không hoàn hảo, nhưng đủ để giúp bạn đi đúng hướng.
Di chuyển lookup
lớp thành bảng DB
Đối với tôi, có vẻ như bạn sẽ được phục vụ tốt hơn ở đây khi di chuyển mục đích của lookup
lớp thành một bảng cơ sở dữ liệu. Hãy tưởng tượng một cái gì đó như thế này:
CREATE TABLE IF NOT EXISTS `tbl_lookup` (
`lookup_id` int(11) NOT NULL AUTO_INCREMENT,
`rider_count` int NOT NULL,
`heat_count` int NOT NULL,
`riders_in_heat_1` int NOT NULL,
`riders_in_heat_2` int,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
sau đó chèn tất cả dữ liệu của bạn từ lookup
lớp học.
Sử dụng JOIN &GROUP BY trong truy vấn SQL đầu tiên của bạn
Bạn cần xác định số lượng tay đua trong một sự kiện và hạng nhất định. Bạn chỉ có thể THAM GIA tbl_event_classes
và tbl_event_entries
sau đó GROUP BY tbl_event_entries.event_id
để có được những số lượng đó.
SELECT tec.class_id, tec.event_id, COUNT(tee.event_id) AS entries_per_class
FROM tbl_event_classes tec
JOIN tbl_event_entries tee ON tee.event_id = tec.event_id
WHERE tec.event_id = :event_id
GROUP BY tee.event_id
Xóa PHP
Bây giờ mã PHP của bạn sẽ dễ theo dõi hơn một chút. Một truy vấn chính để nhận các sự kiện và lớp với số lượng người đi trên mỗi sự kiện trên mỗi lớp. Sau đó, khi bạn lặp lại tập hợp kết quả đó, hãy xác định số lượng người đi trên mỗi lượt nhiệt.
Điều này hơi khó, nhưng tôi chắc rằng bạn có thể hoàn thiện nó từ đây.
function getEntriesPerClass($event_id) {
global $db;
$stmt = $db->prepare(
'SELECT tec.class_id, tec.event_id, COUNT(tee.event_id) AS entries_per_class ' .
'FROM tbl_event_classes tec ' .
'JOIN tbl_event_entries tee ON tee.event_id = tec.event_id ' .
'WHERE tec.event_id = :event_id ' .
'GROUP BY tee.event_id');
$stmt->bindValue(':event_id', $event_id);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
function getRidersInHeats($class_id, $event_id, $riders_per_class)
{
global $db;
$stmt = $db->prepare(
'SELECT tl.riders_in_heat_1, tl.riders_in_heat_2 ' .
'FROM tbl_lookup ' .
'WHERE class_id = :class_id AND event_id = :event_id AND rider_count = :entries');
$stmt->bindValue(':class_id', $class_id);
$stmt->bindValue(':event_id', $event_id);
$stmt->bindValue(':rider_count', $riders_per_class);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
$entriesPerClass = getEntriesPerClass($_GET['event_id']);
foreach($entriesPerClass as $entry) {
$riders = getRidersInHeats($entry['class_id'], $entry['event_id'], $entry['entries_per_class']);
echo
"class : " . $row['class_id'] . "; " .
"ridercount: " . $riders['rider_count'] . "; " .
"heats : " . $riders['heat_count'] . "<br/>";
echo "Heats, consisting of :<br>\n<ul>";
echo "<li>Heat 1: " . $riders['riders_in_heat_1'] . "</li>";
$ridersInHeat2 = $riders['riders_in_heat_2'];
if($ridersInHeat2 > 0) {
echo "<li>Heat 2: " . $riders['riders_in_heat_2'] . "</li>";
}
echo "</ul>";
}