Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Schleife mit einer Abfrage und einer Nachschlagetabelle. mysql und php

Ich habe mein Bestes getan, um die Dinge zu bereinigen, ist vielleicht nicht perfekt, sollte aber als Stupser in die richtige Richtung genügen.

Verschiebe lookup Klasse in die DB-Tabelle

Es scheint mir, als wären Sie hier viel besser bedient, wenn Sie die Absicht der lookup verschieben Klasse in eine Datenbanktabelle. Stellen Sie sich so etwas vor:

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;

fügen Sie dann alle Ihre Daten aus der lookup ein Klasse.

Verwenden Sie JOINs &GROUP BY in Ihrer ersten SQL-Abfrage

Sie müssen die Anzahl der Fahrer in einem bestimmten Event und einer bestimmten Klasse bestimmen. Sie können einfach tbl_event_classes BEITRETEN und tbl_event_entries dann GROUP BY tbl_event_entries.event_id um diese Zählungen zu erhalten.

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

Bereinigung von PHP

Jetzt sollte Ihr PHP-Code etwas einfacher zu verstehen sein. Eine Hauptabfrage, um die Veranstaltungen und Klassen mit der Anzahl der Fahrer pro Veranstaltung und Klasse abzurufen. Bestimmen Sie dann, während Sie diesen Ergebnissatz durchlaufen, die Anzahl der Fahrer pro Lauf.

Das ist ein wenig grob, aber ich bin sicher, dass Sie es von hier aus aufpolieren können.

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